1. 程式人生 > >BZOJ 3210 花神的澆花集會 計算幾何- -?

BZOJ 3210 花神的澆花集會 計算幾何- -?

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 花神的澆花集會 計算幾何- -?