`

poj 2002二分查找方法

 
阅读更多

题意:在平面内给出n个点,问你这些点一共能组成几个不相等的正方形?

思路:几何 + 二分。先排序,然后枚举任意两点(x1,y1)(x2,y2),则如果存在点(x1+y1-y2,y1-x1+x2)(x2+y1-y2,y2-x1+x2)则它们能构成一个正方形(这里方向是确定的,否则还有一种可能)。所以用二分查询是否存在这两个点,有的话ans就+1。最后的ans要/2,因为正方形都重复算了一次。

 

关于二分查找的代码如下:

#include<iostream>
#include<algorithm>
using namespace std;

const int Max = 1005;
struct data
{
	int x, y;
}node[Max];

 

bool cmp(const data &a, const data &b)
{    //  由于下面调用的binary_search(),故要用加const。 
    if(a.x == b.x) 
		return a.y < b.y;
    return a.x < b.x;
}
int main()
{
    int n, i, j;
    while(scanf("%d", &n) && n)
	{
        for(i = 0; i < n; i ++)
            scanf("%d%d", &node[i].x, &node[i].y);
        sort(node, node + n, cmp);      

        //  先排序。这里自己要注意:x相等的y问题不用二维的二分,直接cmp,要理解清楚,就一顺序。
        int ans = 0;
        for(i = 0; i < n; i ++)
            for(j = i + 1; j < n; j ++)
			{
                data tmp;
                tmp.x = node[i].x + node[i].y - node[j].y;
                tmp.y = node[i].y - node[i].x + node[j].x;
                if(!binary_search(node, node + n, tmp, cmp))   //  学会STL的二分。
                    continue;
                tmp.x = node[j].x + node[i].y - node[j].y;
                tmp.y = node[j].y - node[i].x + node[j].x;
                if(!binary_search(node, node + n, tmp, cmp))
                    continue;
                ans ++;
            }
        printf("%d\n", ans/2);
    }
    return 0;
}

 

 

 至于本题关于hash的算法将会进一步阐述……

 

分享到:
评论

相关推荐

    poj模拟题(二分查找)

    在讨论的三道poj模拟题中,都涉及到二分查找的核心思想与实现方法,通过实际的问题场景来加深对二分查找算法的理解与应用。 第一题是Cablemaster(poj1064)。题目描述了一个实际应用问题,需要从一定数量的电缆中...

    POJ算法题目分类

    * 哈希表和二分查找等高效查找法:哈希表和二分查找等高效查找法是指解决问题的高效查找算法,如 poj3349、poj3274、POJ2151、poj1840、poj2002、poj2503。 * 哈夫曼树:哈夫曼树是指解决问题的哈夫曼树算法,如 poj...

    poj题目分类

    * 哈希表和二分查找等高效查找法:例如 poj3349、poj3274、poj2151、poj1840、poj2002、poj2503。 * 哈夫曼树:例如 poj3253。 * 堆:例如 poj2513。 * trie 树:例如 poj2513。 4. 简单搜索: * 深度优先搜索...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj3349, poj3274, POJ2151, poj1840, poj2002, poj2503 - **解释**:哈希表是一种常用的数据结构,用于快速查找和存储数据。 #### 4. 队列/栈 - **例题**:poj3253 - **解释**:队列和栈是两种常见的...

    POJ题目简单分类(ACM)

    - **哈希表和二分查找**:提高查找效率,如poj3349,用于快速定位元素。 - **哈夫曼树**:压缩编码,如poj3253。 - **堆**:如优先队列,用于实现最大值或最小值的快速访问。 - **trie树**:用于高效字符串查询...

    poj各种分类

    包括最长公共子序列、最优二分检索树等问题,关键在于状态转移方程的设计。 ### 六、数学 #### 组合数学 涵盖加法原理、乘法原理、排列组合等,用于解决计数问题,如poj3252。 #### 数论 涉及素数检测、整除性、...

    强大的poj分类

    **简介**:基础算法是算法学习的基础,主要包括排序算法(如冒泡排序、选择排序、插入排序、归并排序、快速排序)、查找算法(如顺序查找、二分查找)、数学算法(如质数判断、最大公约数计算)等。 **重要性**:...

    poj 1064 代码

    POJ(Peking University Online Judge)是一个知名的在线编程竞赛平台,提供了大量的算法练习题目,其中POJ 1064是一道关于二分查找应用的题目。 ### POJ 1064 题目解析 题目要求我们处理一系列长度不等的木棍,...

    经典 的POJ 分类

    - POJ 3373、POJ 1691:二分查找技术的应用。 ### 动态规划 #### 二维动态规划 - **题目示例**: - POJ 1191、POJ 1054:基于矩阵的状态转移方程。 - POJ 3280、POJ 2029:多维状态空间的探索。 #### 递归动态...

    POJ1837-Balance

    解题的关键在于理解和应用适合的算法,比如动态规划、二分查找、平衡树操作等。在分析解题报告时,我们可以学习到如何分析问题、选择合适的算法,并在实际编程中实现这些思想。而AC代码则提供了具体的实现参考,展示...

    POJ1840-Eqs

    1. **基础算法**:POJ题目通常涵盖基础的排序、搜索算法,如冒泡排序、快速排序、二分查找等。对于"POJ1840-Eqs",可能需要理解并应用这些算法。 2. **数据结构**:链表、栈、队列、树、图等数据结构可能会被用到,...

    acm训练计划(poj的题)

    - 提供对排序和查找算法的理解与应用指导,包括快速排序、归并排序、二分查找等经典算法。 4. **贪心算法**: - (poj3295):讲解如何利用贪心策略来解决问题,强调每一步选择都是局部最优解。 5. **动态规划**:...

    poj训练计划.doc

    - 哈希表:用于高效的数据查找,如`poj2151, poj1840`。 - 堆:如二叉堆,用于实现优先队列,如`poj3253`。 - 树:如二叉树和AVL树,用于存储和检索有序数据,如`poj2513`。 - **简单搜索** - 深度优先搜索:如...

    POJ1496-Word Index

    3. **查找算法**:在哈希表或其他数据结构中查找特定单词,可能需要用到线性查找、二分查找或哈希查找。对于大量数据,高效查找算法是必不可少的。 4. **数据结构**:哈希表或数组可能是存储单词索引的有效数据结构...

    poj各种题型详细分类

    根据提供的信息来看,这篇文档似乎是对POJ(Peking Online Judge)平台上一系列编程题目进行的详细分类汇总。POJ是一个非常知名的在线评测系统,广泛用于训练和提高算法设计与编程能力,尤其对于参加ACM国际大学生...

    hduoj poj 的题目分类

    1. **基础算法**:包括排序(冒泡、插入、选择、快速、归并、堆排序等)、查找(线性查找、二分查找)、动态规划等。 2. **数据结构**:链表、栈、队列、树(二叉树、AVL树、红黑树等)、图(深度优先搜索、广度...

    POJ 分类题目

    二分查找适用于有序数组。 - **示例题目**: - poj3349 - poj3274 - poj2151 - poj1840 - poj2002 - poj2503 - **应用场景**:适用于快速查找、统计频率等问题。 **5. 哈夫曼树** - **定义**:一种带权路径...

    POJ1003-Hangover

    AC代码则展示了如何用C++语言将这些思路转化为可执行的程序,其中可能运用了数组、字符串操作、循环、条件判断、递归、动态规划等基本编程元素,也可能涉及高级算法如贪心、二分查找、图论等。 为了深入理解这个...

    北大poj JAVA源码

    在Java源码中,你可以找到各种算法的实现,包括但不限于排序算法(如快速排序、归并排序、冒泡排序)、查找算法(如二分查找、哈希查找)、图论算法(如深度优先搜索、广度优先搜索)、动态规划、贪心算法、回溯法等...

Global site tag (gtag.js) - Google Analytics