【解题报告】 士兵
解题思路:
排序+离散化
我们可以对每个士兵的纵坐标和横坐标进行排序,然后算它们的中位数,就可以得到他们最短的路线,然后就可以对每个士兵和中位数做差,用一个变量记录它们的和,即为答案
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; }
|