题目大意:一个从1开始编号的数组的不完美度为,现在可以将数组分成两个从1开始编号的数组,请问分成的两个数组的不完美度之和最小是多少?
将一个数组分成两半,左半边的不完美度的没有任何变化的。
右半部分,假设是从i开始,区间是[i, n]:
第i个元素由a[i]i变成了a[i]*1,第i+1个元素由a[i+1](i+1)变成了a[i+1]2,第j个元素由a[j]*j变成了a[j](j-i+1)……
即这个区间多有元素都少加了i-1次!
枚举端口位置i,右边区间之和乘以i-1即可以减去的不完美度。
注意,整个区间加起来,极端情况下是1e51e51e9/2,约5e18,好像没爆long long。
#include <bits/stdc++.h> #define LL long long #define N 100005 using namespace std; LL n, m, i, j, k, a[N], s[N]; int main(){ scanf("%lld", &n); for(i=1; i<=n; i++){ scanf("%lld", &a[i]); s[i] = s[i-1] + a[i]; } for(i=1; i<=n; i++){ m = max(m, (s[n]-s[i-1]) * (i-1)); } for(m=-m, i=1; i<=n; i++){ m += a[i] * i; } printf("%lld\n", m); return 0; }