题解
暴力枚举。
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <set>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 20;
const int inf = 1 << 30;
int x[maxn], y[maxn], n;
int calc(int i, int j){
int sum = 0;
for(int k = 0; k < n; ++k)
{
sum += abs(i - x[k]) + abs(j - y[k]);
}
return sum;
}
int main()
{
//fstream cin("data.in");
int t;
for(cin >> t; t--; )
{
cin >> n;
for(int i = 0; i < n; ++i){
cin >> x[i] >> y[i];
}
int ans = inf;
for(int i = 0; i < 100; ++i)
{
for(int j = 0; j < 100; ++j)
{
int tmp = calc(i, j);
ans = min(ans, tmp);
}
}
cout << ans << endl;
}
return 0;
}
发现别人一种更优解法。
设邮局坐标
(x,y)
,问题转化为求解
min(∑|xi−x|)+min(∑|yi−y|)
题目性质,这里 x ,
如果
画下图不难理解。
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <set>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 20;
const int inf = 1 << 30;
int x[maxn], y[maxn], n;
int main()
{
//fstream cin("data.in");
int t;
for(cin >> t; t--; )
{
cin >> n;
for(int i = 0; i < n; ++i) cin >> x[i] >> y[i];
sort(x, x + n);
sort(y, y + n);
int ans = 0;
for(int i = 0; i < n / 2; ++i)
ans += x[n - 1 - i] - x[i] + y[n - 1 - i] - y[i];
cout << ans << endl;
}
return 0;
}