洛谷 P1109 学生分组 题解

好了直接步入正题 题目很简单

我们要求多少次操作能让使 N组学生的人数都在 [L,R] 中。

  1. 首先我们不考虑输出 -1 的情况

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

    2.我们考虑输出-1的情况

     当然这个也非常简单 
    
     如果n*r(所有教室一起能装下的最大人数)小于sum(总学生人数)
    
     我们就输出-1
    
     当然还有n*l(至少需要的学生人数)大于sum 我们就输出-1
    
     但因为数据很水 我们不用考虑人数太少的情况
    
     下面是AC代码

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 int s[110];  // 用来装每组学生的人数
 5 int main()
 6 {
 7     int n,l,r,a=0,b=0,sum=0;
 8     cin>>n;
 9     for(int i=1;i<=n;i++) cin>>s[i],sum+=s[i];  // sum算出总人数
10     cin>>l>>r;
11     for(int i=1;i<=n;i++)
12     {
13         if(s[i]>r) a+=s[i]-r;  //  找到有多少人需要调走
14         if(s[i]<l) b+=l-s[i];  //  找到有多少人需要调来
15     } 
16     if(sum>n*r) cout<<"-1";    //  如果学生人数大于所以教室的极限
17     else cout<<max(a,b);       //  否侧输出a,b的较大值 即最少的次数
18     return 0;
19 } 
AC代码

 

posted on 2018-08-30 17:39  黄丹宁  阅读(230)  评论(0)    收藏  举报

导航