题目链接:https://codeforces.com/contest/985
’A.Chess Placing
题意:给了一维的一个棋盘,共有n(n必为偶数)个格子。棋盘上是黑白相间的。现在棋盘上有n/2个棋子,让你全部移动到黑色格子或者白色格子,要求步数最少,并输出步数。
题解:由于黑色或者白色都是固定位置,我们对棋子位置排个序,然后全部移动到任意一个颜色,取两个最小步数的最小值就好了。
1 #include<bits/stdc++.h> 2 #define clr(x) memset(x,0,sizeof(x)) 3 #define clr_1(x) memset(x,-1,sizeof(x)) 4 #define mod 1000000007 5 #define INF 0x3f3f3f3f 6 #define LL long long 7 #define pb push_back 8 #define pbk pop_back 9 #define ls(i) (i<<1) 10 #define rs(i) (i<<1|1) 11 #define mp make_pair 12 using namespace std; 13 const int N=1e5+10; 14 int a[N],p[N]; 15 int n,d,ans1,ans2; 16 int main() 17 { 18 scanf("%d",&n); 19 ans1=ans2=0; 20 n/=2; 21 for(int i=1;i<=n;i++) 22 scanf("%d",p+i); 23 sort(p+1,p+n+1); 24 for(int i=1;i<=n;i++) 25 { 26 ans1+=abs(p[i]-i*2); 27 ans2+=abs(p[i]-(i*2-1)); 28 } 29 printf("%d\n",min(ans1,ans2)); 30 return 0; 31 }