【解题报告】 士兵

【解题报告】 士兵

题目:士兵

解题思路:

排序+离散化

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

AC代码

#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;
}

猜你喜欢

转载自www.cnblogs.com/wweiyi2004/p/11371067.html
今日推荐