题目描述
有 n 组学生,给出初始时每组中的学生个数,再给出每组学生人数的上界 R 和下界 L (L≤R),每次你可以在某组中选出一个学生把他安排到另外一组中,问最少要多少次才可以使 N 组学生的人数都在 [L,R] 中。
输入格式
第一行一个整数 n,表示学生组数;
第二行 n 个整数,表示每组的学生个数;
第三行两个整数 L,R,表示下界和上界。
输出格式
一个数,表示最少的交换次数,如果不能满足题目条件输出 −1。
输入输出样例
输入 #1
2 10 20 10 15
输出 #1
5
说明/提示
数据范围及约定
对于全部数据,保证 1≤n≤50。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {int n; // 定义变量n,表示学生组数cin >> n; // 从标准输入读取学生组数vector<int> students(n); // 定义一个大小为n的向量,存储每组学生数for (int i = 0; i < n; i++) {cin >> students[i]; // 从标准输入读取每组的学生数}int L, R; // 定义变量L和R,表示学生数的下界和上界cin >> L >> R; // 从标准输入读取学生数的下界和上界int total_students = 0; // 定义变量total_students,用于存储所有学生的总数for (int i = 0; i < n; i++) {total_students += students[i]; // 计算所有学生的总数}// 检查总学生数是否在上下界范围内if (total_students < L * n || total_students > R * n) {cout << -1 << endl; // 如果不在范围内,输出-1并结束程序return 0;}int target = (L + R) / 2; // 计算目标学生数,尽量接近(L + R) / 2int swaps1 = 0, swaps2 = 0, swap = 0; // 定义变量swaps1和swaps2,分别用于存储需要增加和减少的学生数,swap用于存储最终的交换次数// 遍历每组学生数,计算需要增加或减少的学生数for (int i = 0; i < n; i++) {if (students[i] < L) {swaps1 += L - students[i]; // 如果学生数小于下界,计算需要增加的学生数} else if (students[i] > R) {swaps2 += students[i] - R; // 如果学生数大于上界,计算需要减少的学生数}swap = max(swaps1, swaps2); // 取需要增加和减少的学生数的最大值作为最终的交换次数}cout << swap << endl; // 输出最少的交换次数return 0;
}