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 }