1. 程式人生 > >Codeforces 985A 題解

Codeforces 985A 題解

def pan line ons 直接 優化 += span force

題意

有一個長度為\(n\)(\(n\)為偶數)的棋盤,黑白相間,類似於BWBW...BW.現有\(n/2\)個位置有棋子,每次只能向左或向右移動一個棋子一步,棋子不能重疊或移出棋盤.求最少要用多少次才能使所有棋子所在的格子顏色相同.

題解

顯然只有兩種方案:\(1,3,5,\cdots,n-1\)\(2,4,6,\cdots,n\).因為不能越過其他棋子,所以移動步數確定.那麽直接討論兩種情況即可.

代碼

#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <algorithm>
using namespace std; #define gc getchar inline void read(int &x){ // 讀入優化 register bool f; register char ch; for (f = false, ch = gc(); !isdigit(ch); ch = gc()) if (ch == ‘-‘) f = true; for (x = 0; isdigit(ch); ch = gc()) x = ((x + (x << 2)) << 1) + (ch ^ ‘0‘); if (f) x = -x; } const
int N = 105; int n, a[N], s1, s2; inline int abs(int x){ // 求x的絕對值 return x > 0 ? x : -x; } int main(){ read(n), n >>= 1; for (register int i = 1; i <= n; ++i) read(a[i]); sort(a + 1, a + 1 + n); // 排序,最左邊的棋子一定是移動到最左邊的黑/白格子的. for (register int i = 1; i <= n; ++i) s1 += abs(a[i] - ((i << 1
) - 1)), s2 += abs(a[i] - (i << 1)); // s1表示第一種情況,s2表示第二種情況 return printf("%d", s1 < s2 ? s1 : s2), 0; }

Codeforces 985A 題解