P1109 学生分组 题解

· · 题解

蒟蒻的第三篇题解,个人认为讲得比较清楚,求赞QwQ~~

废话少说,直接进入正题:

读完题目,我们就应该知道:输出有两种情况,交换次数和 -1.

先考虑输出 -1 (即不能满足题目条件)的情况:

此时有两种可能,总人数(all)大于组数(n)乘上界(r)或小于组数乘下界(l)。代码实现很简单,求出总数再比较,满足条件输出 -1 。

代码如下:

for(int i=1;i<=n;i++)
{
    all+=a[i];
}
if(all<n*l||all>n*r)
{
    cout<<"-1";
    return 0;
}

然后是满足条件的情况:

用 b 数组存不足下限的组一共缺少的人数,用 c 数组存超过上限的组一共超过的人数。

最简单的方法就是用 c 数组中多出的人数去补 b 数组中缺少的人数,但如果 b,c 不相等呢?

当然要使 b,c 都等于0,所以最少交换次数就是 b,c 中较大的数!这道题就做完了!

上代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[51],b,c,all,l,r,ans;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    cin>>l>>r;
    for(int i=1;i<=n;i++)
    {
        all+=a[i];
    }
    if(all<n*l||all>n*r)
    {
        cout<<"-1";
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]<l)
        {
            b+=(l-a[i]);
        }
        if(a[i]>r) c+=(a[i]-r);
    }
    cout<<max(b,c);
    return 0;
}

大佬勿喷qwq