【题目描述】
幼儿园的N个小朋友得到了M颗糖果。
每个小朋友都有一个想要得到的糖果数目,如果没有达到他们的预期,就会不高兴。不高兴的程度可以用一个数值表示,就是他们无法满足的糖果数目的平方。例如,一个小朋友想要得到32颗糖果,而他只得到29颗糖果,那么有3颗糖果无法满足,因此不高兴值为9.
不幸的是,现有的糖果无法满足所有的小朋友,因此,需要你给出一个分配方案,使得不高兴值的总和最小。
【输入】
第一行两个整数M和N(1<=M<=2*10^9)(1<=N<=100,000)
接下来N行,每行一个整数,表示每个孩子想要的糖果数。每个小于2*10^9且总和肯定超过M
【输出】
最少生气值总和。输出数据保证结果在int64范围之内。
【样例输入】
5 3
1
3
2
【样例输出】
1
#include <bits/stdc++.h> using namespace std; int main() { long long m,n,i,sum=0; scanf("%d%d",&m,&n); long long s[n+1],ans=0; s[0]=0; for(i=1;i<=n;i++) { scanf("%lld",&s[i]); sum+=s[i]; } if(sum<=m){ cout<<0<<endl; return 0; } sort(s+1,s+n+1); long long r=m,tail=0; for(i=n;i>0;i--)//面积法 { if(r>=(s[i]-s[i-1])*(n-i+1)) r-=(s[i]-s[i-1])*(n-i+1); else { long long p=s[i]-r/(n-i+1); long long q=r%(n-i+1); ans+=p*p*(n-i+1-q)+(p-1)*(p-1)*q; tail=i; break; } } for(i=0;i<tail;i++) { ans+=s[i]*s[i]; } printf("%lld\n",ans); return 0; }
平均时生气值最小,达不到平均使最高的减小