HDOJ-4311 Meeting point-1

来源:互联网 发布:php 数组按key排序 编辑:程序博客网 时间:2024/04/27 12:27

由于前几天看到一道一维找最短距离点,那里是取中位数点为会面点,于是我一直在绕着找中位数,发现没法找,编程复杂度太高了。

可以预处理后可以枚举各点。

先按x排序,记录每一个点左右各点到其的距离和,有个递推公式。

再按y排序,同上处理。

然后枚举。


#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<cmath>#include<string>using namespace std;typedef struct Point {long long x,y;long long lx, rx, ly, ry;}Point;Point p[100001];int n;int cmpx(const void *a, const void *b){Point *pa = (Point *)a;Point *pb = (Point *)b;return pa->x - pb->x;}int cmpy(const void *a, const void *b){Point *pa = (Point *)a;Point *pb = (Point *)b;return pa->y - pb->y;}int main(){int t;scanf("%d", &t);while(t--){scanf("%d", &n);int i,j;for(i = 0; i < n; i++){scanf("%I64d%I64d", &p[i].x, &p[i].y);}qsort(p, n, sizeof(p[0]), cmpx);p[0].lx = p[n-1].rx = 0;for(i = 1; i < n; i++)p[i].lx = i * (p[i].x - p[i-1].x) + p[i-1].lx;for(i = n - 2; i >= 0; i--)p[i].rx = (n - i - 1) * (p[i+1].x - p[i].x) + p[i+1].rx;qsort(p, n, sizeof(p[0]), cmpy);p[0].ly = p[n-1].ry = 0;for(i = 1; i < n; i++)p[i].ly = i * (p[i].y - p[i-1].y) + p[i-1].ly;for(i = n - 2; i >= 0; i--)p[i].ry = (n - i - 1) * (p[i+1].y - p[i].y) + p[i+1].ry;long long ans = p[0].lx + p[0].rx + p[0].ly + p[0].ry;for(i = 1; i < n; i++){long long tmp = p[i].lx + p[i].rx + p[i].ly + p[i].ry;if(tmp < ans) ans = tmp;}printf("%I64d\n", ans);}return 0;}


0 0
原创粉丝点击