`

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的算法将会进一步阐述……

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics