程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> HDU4312 Meeting point

HDU4312 Meeting point

編輯:關於C++

題目鏈接:

www.2cto.com

題意:給定平面坐標上n(n<=100000)個點,然後在其中選一個,使得所有點到當前點的Chebyshev距離和最小。

 

分析:

切比雪夫距離:設a(x1,y1),b(x2,y2);DIS = max(|x1-x2|,|y1-y2|) = (|x1-x2+y1-y2|+|x1-x2-y1+y2|)/2;

我們將點aa的坐標看成(x1+y1,x1-y1),bb的坐標看成(x2+y2,x2-y2),從幾何意義上講相當於點在原

坐標系上逆時針旋轉45度,並將坐標擴大√2倍。

然後求新的的最小的曼哈頓距離和的一半即可。

 

代碼如下:

 

#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef long long LL;
const int maxn = 1e5+10;

struct point{
    int x,y;
    LL sum;
}p[maxn];

bool cmp1(point A,point B)
{
    if(A.x= 1; --i) {
            p[i].sum += sum - (n-i) * p[i].x;
            sum += p[i].x;
        }
        sum = 0;
        sort(p+1, p+1+n, cmp2);
        for (LL i = 1; i <= n; ++i) {
            p[i].sum += (i-1) * p[i].y -sum;
            sum += p[i].y;
        }
        sum = 0;
        LL ans = 1LL<<62;
        for (LL i = n; i >= 1; --i) {
            p[i].sum += sum - (n-i) * p[i].y;
            ans = min(ans, p[i].sum);
            sum += p[i].y;
        }
        printf(%I64d
,ans/2);
    }
    return 0;
}

 

 

 

 

??
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved