BZOJ 3210 花神的澆花集會 計算幾何- -?
阿新 • • 發佈:2017-06-07
i++ -1 相等 return spa ret 我們 坐標 track
題目大意:給定平面上的n個點,求一個點到這n個點的切比雪夫距離之和最小
與3170不同的是這次選擇的點無需是n個點中的一個
首先將每一個點(x,y)變為(x+y,x-y) 這樣新點之間的曼哈頓距離的一半就是原點之間的切比雪夫距離
因為曼哈頓距離中橫縱坐標不互相幹擾,因此我們能夠將橫縱坐標分開處理
每一維要選一個坐標 到其它全部坐標的絕對值之和相等 非常easy想到中位數
可是直接選擇中位數得到的點可能橫縱坐標奇偶性不同 這樣代回原點中發現不是整點
因此假設得到的點橫縱坐標奇偶性同樣直接輸出距離 不同的話選擇周圍的四個點進行判定 選擇最小的距離輸出就可以
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 100100 using namespace std; int n,X[M],Y[M]; long long Check(int x,int y) { int i; long long re=0; for(i=1;i<=n;i++) re+=abs(x-X[i])+abs(y-Y[i]); return re; } int main() { int i,x,y; cin>>n; for(i=1;i<=n;i++) { scanf("%d%d",&x,&y); X[i]=x+y;Y[i]=x-y; } sort(X+1,X+n+1); sort(Y+1,Y+n+1); x=X[n+1>>1]; y=Y[n+1>>1]; if( ~(x^y)&1 ) cout<<Check(x,y)/2<<endl; else cout<<min(min(Check(x+1,y),Check(x-1,y)),min(Check(x,y+1),Check(x,y-1)))/2<<endl; return 0; }
BZOJ 3210 花神的澆花集會 計算幾何- -?