P1109 学生分组

https://www.luogu.com.cn/problem/P1109
涉及知识点:贪心,模拟

橙色题
思路:

一.
我们首先要找到有多少人多于上限需要调走(用a表示)
  
  所有缺少人数的组需要多少人来补(用b表示)
  
  那么,最优的办法当然是让a去补b
  
  因为不知道a,b谁更大
  
  所以 max(a,b)就是最少的次数

二.考虑输出-1的情况
如果n*r(所有教室一起能装下的最大人数)小于sum(总学生人数)
  
  我们就输出-1
  
  当然还有n*l(至少需要的学生人数)大于sum 我们就输出-1
三.输出max(a,b)

#include <iostream>
#include <algorithm>
using namespace std;
int s[110];  // 用来装每组学生的人数
int main()
{
    int n,l,r,a=0,b=0,sum=0;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>s[i],sum+=s[i];  // sum算出总人数
    cin>>l>>r;
    for(int i=1;i<=n;i++)
    {
        if(s[i]>r) a+=s[i]-r;  //  找到有多少人需要调走
        if(s[i]<l) b+=l-s[i];  //  找到有多少人需要调来
    } 
    if(sum>n*r) cout<<"-1";    //  如果学生人数大于所以教室的极限
    else cout<<max(a,b);       //  否侧输出a,b的较大值 即最少的次数
    return 0;
} 

 

 
posted @ 2022-07-04 19:06  -イレイナ  阅读(31)  评论(0)    收藏  举报