这是一道洛谷普及题https://www.luogu.com.cn/problem/P1109
有 组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界 和下界 ,每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 组学生的人数都在 中。
第一行一个整数 ,表示学生组数;
第二行 个整数,表示每组的学生个数;
第三行两个整数 ,表示下界和上界。
一个数,表示最少的交换次数,如果不能满足题目条件输出 。
2 10 20 10 15
5
对于全部数据,保证 。
思路是贪心,每次我们可以把某一个组的某个成员调到另一个组,想要让所有组都维持在l,r,最优解就是每次都从数量大于r的组调人去数量小于l的组就可以了,所以我们先计算所有大于r的组多出来的人(需要去掉这些人),和小于l的少的人数,我们至少要从对应去掉或者补齐那么多人,那么到底多少人呢,之他们的最大值就行了
接下来就是不可能的情况也就是-1,很简单,就是所有人数加起来 < l * n,或者 > r * n
代码很简单
cpp
#include <iostream>
using namespace std;
int n, l, r;
int a[101];
int b = 0,c = 0;
int cnt;
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
cin >> l >> r;
for(auto i = 0; i < n; i++) {
if(a[i] < l) {
b += (l - a[i]);
}
if(a[i] > r) {
c += (a[i] - r);
}
cnt += a[i];
}
if(cnt < (l * n) || cnt > (r * n)) {
cout << -1 << endl;
return 0;
}
// cout << b << " " << c << endl;
if(b > c) {
cout << b << endl;
}else{
cout <<c << endl;
}
}
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!