用C语言编写$n$ 个人参加一场考试,其中第 $i$ 个人的得分为 $a_i$现在至少需要发 $k$ 个证书。如果存在 $1 \le x, y \le n$,$a_x \ge a_y$ 且 $x$ 未拿到礼物但 $y$ 拿到证书,$x$ 会不满意。主办方希望每个人都满意,求颁发的礼物数量的最小值。
时间: 2023-09-04 16:12:06 浏览: 140
这是一道贪心算法的问题。我们可以先将得分从大到小排序,然后从最高分的人开始向下考虑。对于当前考虑的这个人,如果他还没有拿到证书,那么我们就一定要给他发一份证书,这样他就不会不满意了。同时,我们需要记录已经发出的证书数量 $cnt$,如果 $cnt$ 已经达到 $k$,那么后面的人就不需要再发证书了。
以下是 C 语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
#define MAXN 100005
int a[MAXN];
int cmp(const void *a, const void *b) {
return (*(int *)b - *(int *)a);
}
int main() {
int n, k;
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
qsort(a + 1, n, sizeof(int), cmp);
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (cnt < k && i < n && a[i] > a[i + 1]) {
cnt++;
}
}
printf("%d\n", cnt);
return 0;
}
```
时间复杂度为 $O(n\log n)$。
阅读全文