P9044 [PA 2021] Koszulki
解题思路
这道题目需要找到在满足特定条件下,主办方需要颁发的最小礼物数量。条件是不能有得分更高的人没拿到礼物而得分更低的人却拿到礼物。
方法思路
-
排序处理:将所有人的得分按从高到低排序,这样可以方便地处理得分高低的关系。
-
确定初始礼物数量:主办方至少需要颁发
k件礼物,所以初始时取前k个得分最高的人。 -
处理相同得分的情况:如果第
k+1个人的得分与第k个人相同,那么必须也给第k+1个人颁发礼物,否则会导致不满意的情况。继续检查后续是否有更多得分相同的人,直到遇到得分不同的人为止。 -
输出结果:最终确定的礼物数量即为答案。
#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存储所有参赛者的得分,并读取n和k的值。 -
排序处理:使用
sort函数将数组a按得分从高到低排序,greater<int>()确保降序排列。 -
处理相同得分的情况:从第
k+1个位置开始检查,如果当前人的得分与前一个相同,则增加k的值,直到遇到得分不同的人为止。 -
输出结果:最终
k的值即为满足条件的最小礼物数量。
这种方法确保在满足题目条件的情况下,尽可能少地颁发礼物,同时避免了因得分相同而导致的不满意情况。时间复杂度主要由排序决定,为O(n log n),适用于给定的数据范围。

浙公网安备 33010602011771号