1 条题解

  • 1
    @ 2022-08-15 23:44:29
    #include<bits/stdc++.h>
    using namespace std;
    int t,m,n;
    int a[100005];
    int main()
    {
        freopen("candy.in","r",stdin);
        freopen("candy.out","w",stdout);
        scanf("%d",&t);
        while(t--)
        {
            int sum=0,zheng,Mod,cnt;//sum 用于求所有孩子想吃的糖果数 
            long long ans=0;
            scanf("%d%d",&m,&n);
            cnt=n;
            for(int i=1; i<=n; i++) 
            scanf("%d",&a[i]),sum+=a[i];
            if(sum<=m)//一旦现在拥有的能满足孩子的愿望 
            {
                printf("0\n");//不高兴度为 0 
                continue;
            }
            sum-=m/*求缺少几个*/,zheng=sum/n/*求先能平均分多少个*/,Mod=sum%n/*平均分后还有多少个*/;
            sort(a+1,a+1+n);//排序 
            for(int i=1; i<=n; i++)
            {
                if(i<=(n-zheng))//模拟吧!!! 
                {
                    if(Mod<=a[i])
                    {
                        ans+=Mod*Mod;//注意乘上平方 
                        sum-=Mod;//用完了就减 
                        cnt--;//个数 -- 
                    }
                    else//同理,注意情况变化即可 
                    {
                        ans+=a[i]*a[i];
                        sum-=a[i];
                        cnt--;
                        Mod=sum/cnt;
                        zheng=sum%cnt;
                    }
                }
                else//同上 
                {
                    if(Mod+1<=a[i])
                    {
                        ans+=(Mod+1)*(Mod+1);
                        sum-=Mod+1;
                        cnt--;
                    }
                    else
                    {
                        ans+=a[i]*a[i];
                        sum-=a[i];
                        cnt--;
                        Mod=sum/cnt;
                        zheng=sum%cnt;
                    }
                }
            }
            printf("%lld\n",ans);//输出结果 
        }
        return 0;
    }
    
  • 1

信息

ID
1523
难度
5
分类
数学模拟 点击显示
标签
递交数
5
已通过
1
通过率
20%
上传者