Soldiers

思路

此题是求将不同位置的士兵移到一行所需要的最少步数。由于步数是整数,可以分解成求x方向上的最小移动步数,再求y方向上的最小移动步数,最后相加即可。
y方向上的最小移动步数可以先对y数组进行排序,求得y方向上的中位数,从而求得最终排成行的纵坐标,就能求出y方向上的最小步数,x方向上也是类似,只是直接球中位数的话最后移动后可能会有些点会重复,这是题目不允许的,因此需要将排序后的x坐标减去相应的下标,来实现不重复的目的,然后一样求中位数,求x方向上的最小移动步数,最后将两个步数加起来就可以了。

   #include<iostream>
   #include<cmath>
   #include<algorithm>
   using namespace std;
   bool com(int a,int b){
       return a<b;
   }
   int main(){
       int n,x[10001],y[10001],i;
       cin>>n;
       for(i=0;i<n;i++){
           cin>>x[i]>>y[i];
       }
       sort(x,x+n,com);
       sort(y,y+n,com);
       for(i=0;i<n;i++){
           x[i]-=i;
       }
       sort(x,x+n,com); 
       int midy=y[n/2];
       int midx=x[n/2];
       int sum=0;
       for(i=0;i<n;i++){
           sum+=abs(x[i]-midx)+abs(y[i]-midy);
       }
       cout<<sum<<endl;
       return 0;
   }

results matching ""

    No results matching ""