ural 1207 计算几何

来源:互联网 发布:方维p2p 3.5 源码下载 编辑:程序博客网 时间:2024/06/10 16:28

1207. Median on the Plane

Time Limit: 1.0 second
Memory Limit: 16 MB
The are N points on the plane (N is even). No three points belong to the same strait line. Your task is to select two points in such a way, that strait line they belong to divides the set of points into two equal-sized parts.

Input

First line contains one integer N (2 ≤ N ≤ 10000). Each of next N lines contains pair of integersxiyi (−109 ≤ xiyi ≤ 109), the coordinates of i-th point.

Output

Print the numbers of selected points.

Sample

inputoutput
40 01 00 11 1
1 4
对于这题,首先想到的是暴搜,无疑是超时的。想了很久没有思路,最终偷窥了别人的思路,利用极角排序,思路豁然开朗。
首先找到最左下方的点p0,将剩下的按逆时针排序(相对于最左下方的点),点p0和中间的那个点mid,即所求的点。
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;struct Point {    double x, y;    int rank;}p[10009];double direction(Point p1, Point p2) {    return ((p1.x-p[0].x)*(p2.y-p[0].y)-(p2.x-p[0].x)*(p1.y-p[0].y));}int cmp(Point p1, Point p2) {    if (direction(p1, p2)>0)        return 0;    return 1;}int main(){    int i, n, k = 0;    scanf("%d", &n);    for (i = 0; i < n; ++i) {        scanf("%lf %lf", &p[i].x, &p[i].y);        p[i].rank = i+1;        if (p[i].x < p[k].x || (p[i].x == p[k].x &&p[i].y < p[k].y))            k = i;    }    swap(p[0], p[k]);    sort(p+1, p+n, cmp);    printf("%d %d\n", p[0].rank, p[n/2].rank);    return 0;}


原创粉丝点击