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; }