BZOJ3210: 花神的浇花集会 数论

版权声明:xgc原创文章,未经允许不得转载。 https://blog.csdn.net/xgc_woker/article/details/82780783

Description
平面上有一些点,让你找到一个点使所有点到他的切比雪夫距离总和最小。


Sample Input
3
1 2
2 1
3 3


Sample Output
3


考虑把切比雪夫距离转为曼哈顿距离。
不会的话自己去学吧。
这题数据也太水了吧。。。


#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long LL;
LL _min(LL x, LL y) {return x < y ? x : y;}
int read() {
	int s = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
	return s * f;
}

int a[110000], b[110000];
int n;

int main() {
	n = read();
	for(int i = 1; i <= n; i++) {
		int x = read(), y = read();
		a[i] = x + y, b[i] = x - y;
	} sort(a + 1, a + n + 1), sort(b + 1, b + n + 1);
	int h1 = a[n / 2 + 1], h2 = b[n / 2 + 1]; LL ans = 0;
	if((h1 + h2) % 2 == 0) {
		for(int i = 1; i <= n; i++) {
			ans += abs(h1 - a[i]) + abs(h2 - b[i]);
		} printf("%lld\n", ans / 2);
	} else {
		LL hh = 0; h1++;
		for(int i = 1; i <= n; i++) {
			hh += abs(h1 - a[i]) + abs(h2 - b[i]);
		} ans = hh;
		hh = 0; h1--; h1--;
		for(int i = 1; i <= n; i++) {
			hh += abs(h1 - a[i]) + abs(h2 - b[i]);
		} ans = _min(ans, hh);
		hh = 0; h1++; h2++;
		for(int i = 1; i <= n; i++) {
			hh += abs(h1 - a[i]) + abs(h2 - b[i]);
		} ans = _min(ans, hh);
		hh = 0; h2--; h2--;
		for(int i = 1; i <= n; i++) {
			hh += abs(h1 - a[i]) + abs(h2 - b[i]);
		} ans = _min(ans, hh);
		printf("%lld\n", ans / 2);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xgc_woker/article/details/82780783