算法竞赛备考冲刺必刷题(C++) | 洛谷 P1109 学生分组

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

洛谷:P1109 学生分组 - 洛谷

【题目描述】

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

【输入】

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

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

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

【输出】

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

【输入样例】

2
10 20
10 15

【输出样例】

5

【算法标签】

《洛谷 P1109 学生分组》 #模拟# #贪心#

【代码详解】

#include 
using namespace std;

const int N = 55;  // 定义最大元素数量

int n;             // 元素个数
int a[N];          // 存储各元素值
int l, r;          // 区间左右边界
int sum = 0;       // 元素总和
int x = 0, y = 0;  // x: 超出上限的总量,y: 低于下限的总量
int ans;           // 最终结果

int main()
{
    // 输入元素个数
    cin >> n;
    
    // 输入各元素值并计算总和
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        sum += a[i];
    }
    
    // 输入目标区间[l,r]
    cin >> l >> r;
    
    // 检查总和是否在可行范围内
    if (sum < n * l || sum > n * r)
    {
        cout << -1 << endl;  // 不可行
        return 0;
    }
    
    // 计算超出上限和低于下限的总量
    for (int i = 1; i <= n; i++)
    {
        if (a[i] > r)
            x += (a[i] - r);  // 计算超出部分
        if (a[i] < l)
            y += (l - a[i]);  // 计算不足部分
    }
    
    // 取较大值作为结果
    ans = max(x, y);
    
    // 输出结果
    cout << ans << endl;
    
    return 0;
}

【运行结果】

2
10 20
10 15
5

你可能感兴趣的:(算法,c++,开发语言)