真·水题。
环形均分纸牌模板题。
只需求出前缀和,然后取中位数求前缀和总和即可。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 typedef long long LL; 5 const int N = 1000010; 6 LL a[N], sum[N]; 7 int main() { 8 int n; 9 scanf("%d", &n); 10 for(int i = 1; i <= n; i++) { 11 scanf("%d", &a[i]); 12 sum[i] = sum[i - 1] + a[i]; 13 } 14 LL k = sum[n] / n; 15 for(int i = 1; i <= n; i++) { 16 a[i] -= k; 17 sum[i] = sum[i - 1] + a[i]; 18 } 19 sort(sum + 1, sum + n + 1); 20 k = sum[(n + 1) >> 1]; 21 LL ans = 0; 22 for(int i = 1; i <= n; i++) { 23 ans += abs(sum[i] - k); 24 } 25 printf("%lld ", ans); 26 return 0; 27 }
哈哈哈,5分钟A掉bz题