P9044 [PA 2021] Koszulki

解题思路

这道题目需要找到在满足特定条件下,主办方需要颁发的最小礼物数量。条件是不能有得分更高的人没拿到礼物而得分更低的人却拿到礼物。

方法思路

  1. 排序处理:将所有人的得分按从高到低排序,这样可以方便地处理得分高低的关系。

  2. 确定初始礼物数量:主办方至少需要颁发k件礼物,所以初始时取前k个得分最高的人。

  3. 处理相同得分的情况:如果第k+1个人的得分与第k个人相同,那么必须也给第k+1个人颁发礼物,否则会导致不满意的情况。继续检查后续是否有更多得分相同的人,直到遇到得分不同的人为止。

  4. 输出结果:最终确定的礼物数量即为答案。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10; // 定义常量N,作为数组的最大长度
int a[N]; // 存储每个人的得分
int n,k; // n表示参赛人数,k表示至少需要颁发的礼物数量

int main()
{
    cin >> n >> k; // 输入参赛人数和至少需要颁发的礼物数量
    for(int i = 1; i <= n; i++) cin >> a[i]; // 输入每个人的得分
    sort(a + 1,a + 1 + n,greater<int>()); // 将得分按从高到低排序
    for(int i = k + 1; i <= n; i++) // 从第k+1个人开始检查
        if(a[i] == a[i - 1]) k++; // 如果得分相同,增加礼物数量
        else break; // 遇到得分不同的人,停止检查
    
    cout << k; // 输出最终的礼物数量
    return 0;
}

代码解释

  • 输入处理:使用数组a存储所有参赛者的得分,并读取nk的值。

  • 排序处理:使用sort函数将数组a按得分从高到低排序,greater<int>()确保降序排列。

  • 处理相同得分的情况:从第k+1个位置开始检查,如果当前人的得分与前一个相同,则增加k的值,直到遇到得分不同的人为止。

  • 输出结果:最终k的值即为满足条件的最小礼物数量。

这种方法确保在满足题目条件的情况下,尽可能少地颁发礼物,同时避免了因得分相同而导致的不满意情况。时间复杂度主要由排序决定,为O(n log n),适用于给定的数据范围。

posted @ 2025-05-01 15:17  CRt0729  阅读(15)  评论(0)    收藏  举报