【解题报告】 士兵

题目:士兵

解题思路:

排序+离散化

我们可以对每个士兵的纵坐标和横坐标进行排序,然后算它们的中位数,就可以得到他们最短的路线,然后就可以对每个士兵和中位数做差,用一个变量记录它们的和,即为答案

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=10005;
int n;
long long x[maxn],y[maxn],mx,my,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
sort(x+1,x+1+n);
sort(y+1,y+1+n);
for(int i=1;i<=n;i++)
x[i]-=i;
sort(x+1,x+1+n);
mx=x[(n+1)>>1];
my=y[(n+1)>>1];
for(int i=1;i<=n;i++)
{
ans+=abs(x[i]-mx);
ans+=abs(y[i]-my);
}
cout<<ans<<endl;
return 0;
}