bzoj1045 糖果传递

真·水题。

环形均分纸牌模板题。

只需求出前缀和,然后取中位数求前缀和总和即可。

 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 }
AC代码

哈哈哈,5分钟A掉bz题

原文地址:https://www.cnblogs.com/huyufeifei/p/9024213.html