$n$ 个人参加一场考试,其中第 $i$ 个人的得分为 $a_i$现在至少需要发 $k$ 个证书。如果存在 $1 \le x, y \le n$,$a_x \ge a_y$ 且 $x$ 未拿到礼物但 $y$ 拿到证书,$x$ 会不满意。主办方希望每个人都满意,求颁发的证书数量的最小值。 输入 第一行两个整数 $n, k$。第二行 $n$ 个整数 $a_1, a_2, a_3, \dots, a_n$ 输出 一行一个整数,表示求得值。
时间: 2023-09-04 15:15:56 浏览: 62
这道题可以使用贪心算法来解决。
首先,我们将得分从高到低排序,然后从得分最高的人开始发证书,依次向下发证书,直到前 $k$ 个人都拿到了证书。这样可以保证前 $k$ 个人一定满意,因为他们的得分都不低于之后的人。
接下来,我们需要判断是否还需要发证书。如果还需要发证书,那么我们就从第 $k+1$ 个人开始向下发证书,直到所有人都拿到了证书。这样可以保证任意两个得分相等的人中,没有一个人未拿到证书而另一个人拿到了证书。
具体实现可以参考以下代码:
```python
n, k = map(int, input().split())
a = list(map(int, input().split()))
a.sort(reverse=True) # 将得分从高到低排序
ans = k # 至少需要发 k 个证书
for i in range(k, n):
if a[i] == a[k - 1]: # 如果第 i 个人和第 k 个人得分相等
ans += 1 # 需要再发一个证书
else:
break # 否则可以停止发证书
print(ans)
```
希望能对你有所帮助!
相关问题
用C语言编写$n$ 个人参加一场考试,其中第 $i$ 个人的得分为 $a_i$现在至少需要发 $k$ 个证书。如果存在 $1 \le x, y \le n$,$a_x \ge a_y$ 且 $x$ 未拿到礼物但 $y$ 拿到证书,$x$ 会不满意。主办方希望每个人都满意,求颁发的礼物数量的最小值。
这是一道贪心算法的问题。我们可以先将得分从大到小排序,然后从最高分的人开始向下考虑。对于当前考虑的这个人,如果他还没有拿到证书,那么我们就一定要给他发一份证书,这样他就不会不满意了。同时,我们需要记录已经发出的证书数量 $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)$。
阅读全文