编辑
2024-09-14
算法题
00
请注意,本文编写于 238 天前,最后修改于 238 天前,其中某些信息可能已经过时。

目录

学生分组
题目描述
输入格式
输出格式
样例 #1
样例输入 #1
样例输出 #1
提示
数据范围及约定

这是一道洛谷普及题https://www.luogu.com.cn/problem/P1109

学生分组

题目描述

nn 组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界 RR 和下界 L (LR)L\ (L \le R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 NN 组学生的人数都在 [L,R][L,R] 中。

输入格式

第一行一个整数 nn,表示学生组数;

第二行 nn 个整数,表示每组的学生个数;

第三行两个整数 L,RL,R,表示下界和上界。

输出格式

一个数,表示最少的交换次数,如果不能满足题目条件输出 1-1

样例 #1

样例输入 #1

2 10 20 10 15

样例输出 #1

5

提示

数据范围及约定

对于全部数据,保证 1n501\le n \le 50

思路是贪心,每次我们可以把某一个组的某个成员调到另一个组,想要让所有组都维持在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 许可协议。转载请注明出处!