AtCoder Beginner Contest 067 C - Splitting Pile
考察
カード全体の累積和をまず求める。
N枚のときの累積和と(カード全体の累積和 - N枚のときの累積和)の差分をとり、最小の数を求めればおーけー。
コード
#include <iostream> #include <algorithm> #define ll long long int L = 2000000007; using namespace std; ll a[200050] = {}; ll sum[200050] = {}; int main() { ll n; ll ans = L; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } sum[0] = 0; for (int i = 0; i < n; i++) { sum[i + 1] = a[i] + sum[i]; } ll Max = sum[n]; for (int i = 1; i < n; i++) { ll acm = abs(sum[i] - (Max - sum[i])); ans = min(ans, acm); } cout << ans << endl; }
累積和はO(N)でいけるからとても便利