soldiers
Posted hhyx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了soldiers相关的知识,希望对你有一定的参考价值。
# 题意
n名士兵,每个士兵的位置由一对整数(x,y)来表示,士兵可以进行移动,每一次可以上下左右移动,通过移动使所有士兵处于同于水平线,即y相同x相邻,求最少的移动次数,每个士兵只能占据一个单独的位置。
# 题解
如果单纯的对横坐标求中位数,不能满足相邻这一个条件,
对x进行排序后,要求使得士兵全部相邻的最小移动次数.那么在移动前和移动后,士兵的相对位置是不变的.
举例来说,记add为移动后的最左端的士兵的前一位置
x[ 1 ] -> add + 1;
x[ 2 ] -> add + 2;
…
x[ n ] -> add + n;
转换一下
x[ 1 ] - 1 -> add;
x[ 2 ] - 2 -> add;
…
x[ n ] - n -> add;
处理过后,就转化为了移动到同一个点的情况,可以直接用中位数来做
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define ld long double 4 #define pii pair<int,int> 5 using namespace std; 6 const int N=1e4+10; 7 int x[N],y[N]; 8 int n; 9 int main(){ 10 ios::sync_with_stdio(0); 11 cin.tie(0); 12 cout.tie(); 13 cin>>n; 14 int ans=0; 15 for(int i=1;i<=n;i++) 16 cin>>x[i]>>y[i]; 17 sort(x+1,x+1+n); 18 sort(y+1,y+1+n); 19 for(int i = 1; i <= n; i++) 20 x[i]-=i; 21 sort(x+1,x+1+n); 22 23 24 for(int i = 1; i <= n; i++) 25 ans += abs(x[i] - x[(n+1)>>1]); 26 27 for(int i = 1; i <= n; i++) 28 ans += abs(y[i] - y[(n+1)>>1]); 29 cout<<ans; 30 }
以上是关于soldiers的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 546B-Soldier and Badges