【AtCoder】ABC 467 C - Adjacent Sums (easy)
AtCoder/ABC/C問題AtCoder/ABC/300点問題AtCoder/茶DiffAtCoder/NoviSteps/2QAtCoder/前から一意に決まるAtCoder/ビット演算競技プログラミング

C - Adjacent Sums (easy)
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
AtCoder
実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 608 / NoviSteps: 2Q / 配点: 300 点
問題概要
以上 以下の整数からなる整数列 が与えられる。
に対して以下の操作を好きな回数行う。
- 以上 以下の整数 を つ選び、 に を加える。
以下の条件を満たすようにするために必要な操作回数の最小値を求めよ。 なお、問題の制約下では、必ず条件を満たすようにできることが証明できる。
- について、 を で割った余りは に等しい。
制約
- 入力される値はすべて整数
考察
なので、 は か のいずれかであり、これはビット列とみなしてよい。
操作後のビット列を として、条件を満たすためには、 が成り立つ必要がある。
これは、 XOR を使うと以下のように書き直せる。
つまり、最初のビット を決めると、残りの 個のビットは一意に決まる。
元の が取り得る値は か なので、 番目の要素に対する操作回数は、
- の場合は 回
- の場合は 回
である。 回以上余分に加えると偶奇は同じまま操作回数だけ増えるので、各要素への操作は高々 回としてよい。
したがって、最初のビット を とした場合と とした場合の両方を試して、操作回数の合計が少ない方を選べばよい。
実装例
CPP
1.#include <bits/stdc++.h>2.using namespace std;3. 4.#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)5. 6.// ======================================== //7. 8.int main()9.{10. int N, M;11. cin >> N >> M;12. vector<int> A(N), B(N - 1);13. rep(i, 0, N) cin >> A[i];14. rep(i, 0, N - 1) cin >> B[i];15. 16. auto calc = [&](int bit) -> int {17. int res = 0;18. int now = bit;19. rep(i, 0, N) {20. if (now != A[i]) {21. res++;22. }23. 24. if (i < N - 1) {25. now ^= B[i];26. }27. }28. return res;29. };30. 31. cout << min(calc(0), calc(1)) << endl;32. 33. return 0;34.}https://atcoder.jp/contests/abc467/submissions/77592020
atcoder.jp
実装時間: 10分
コメント
Twitter では動的計画法っぽく解いている人もいたが、これはE問題意識してるのか?





