Official

B - Break a Stick Editorial by KumaTachiRen


端から \(i\) 番目の切れ込みで棒を折ったとき、できる \(2\) 本の棒の長さは \(L_1+L_2+\cdots+L_i\) と \(L_{i+1}+L_{i+2}+\cdots+L_N\) です。

すべての切れ込みについてこの長さと差の絶対値を計算し、それらの最小値を出力すればよいです。

(今回の制約では一つずつ足す方針で十分ですが、累積和や差分更新を利用することでより高速に解くことができます。)

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
  int N;
  cin >> N;
  vector<int> L(N);
  for (int &l : L) cin >> l;
  int ans = 1000000000;
  for (int i = 1; i < N; i++) {
    int sum_l = 0, sum_r = 0;
    for (int j = 0; j < i; j++) sum_l += L[j];
    for (int j = i; j < N; j++) sum_r += L[j];
    ans = min(ans, abs(sum_l - sum_r));
  }
  cout << ans << endl;
}

実装例(Python)

N = int(input())
L = list(map(int, input().split()))
ans = min(abs(sum(L[:i]) - sum(L[i:])) for i in range(1, N))
print(ans)

posted:
last update: