洛谷 P1109 学生分组 题解
好了直接步入正题 题目很简单
我们要求多少次操作能让使 N组学生的人数都在 [L,R] 中。
-
首先我们不考虑输出 -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 }
浙公网安备 33010602011771号