分糖果

【题目描述】

幼儿园的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
",ans);
    return 0;
}
View Code

平均时生气值最小,达不到平均使最高的减小

不要忘记努力,不要辜负自己 欢迎指正 QQ:1468580561
原文地址:https://www.cnblogs.com/smallocean/p/8543643.html