AcWing 122. 糖果传递

原题链接

考察:贪心

与七夕祭是差不多的题目

思路:

       有两种推导方式,一种是前缀和一种是解方程的方法推导.

       主要是讲第二种方式,假设第一个人给第n个人x1个,第二个人给第一个人x2个,以此类推,最后ans = x1+x2+x3...+xn(每一个都是绝对值).假设所有人的糖果平均数是ax,可以得出方程a1-x1+x2 = ax,a2-x2+x3=ax...我们可以发现前n-1个方程能够凑出最后一个方程,所以共有n-1方程和n个未知数,由线性代数的知识可得,有一个自由变量,该自由变量可以表示其他所有x.剩下看大佬题解吧,口述可能效果很差 GO

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 1000010;
 6 typedef long long LL;
 7 int a[N],mid;
 8 LL sum,C[N],ans;
 9 int main()
10 {
11     int n;
12     scanf("%d",&n);
13     for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum+=a[i];
14     mid = sum/n;
15     for(int i=n;i>=1;i--) C[i] = C[i+1]+mid-a[i];
16     sort(C+1,C+n+1);
17     LL m = C[n+1>>1];
18     for(int i=1;i<=n;i++) ans+=abs(m-C[i]);
19     printf("%lld\n",ans);
20     return 0;
21 }

 

posted @ 2021-02-26 11:37  acmloser  阅读(60)  评论(0编辑  收藏  举报