Codeforces 985A 題解
阿新 • • 發佈:2018-05-26
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 題解