$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 07:15:56 浏览: 40
这道题可以使用贪心算法来解决。
首先,我们将得分从高到低排序,然后从得分最高的人开始发证书,依次向下发证书,直到前 $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)$。
问题 A: 一场考试 提交: 445 | 解决: 42 | 时间限制: 1.00s | 内存限制: 256MB [ 提交 ] [状态] 题目描述 $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$ 输出 一行一个整数,表示求得值。 输入输出样例 样例输入 #1 复制 5 3 75 95 120 75 41 样例输出 #1 复制 4 提示 样例为除了第五个人都有证书。数据范围:$1 \le k \le n \le 2000,1 \le a_i \le 120$。
这道题可以使用贪心算法求解。我们可以先将得分从大到小排序,然后依次给排名靠前的 $k$ 个人颁发证书。这样可以保证排名靠前的 $k$ 个人一定满意,而且对于一个得分最高的人,他一定可以拿到证书,因为他不会比其他人更不满意。
然后我们从第 $k+1$ 个人开始,依次检查他是否满意。如果他不满意,就给他颁发证书,这样可以保证他满意。但是可能会导致其他人不满意,所以我们需要检查其他人是否不满意,如果有,就再次颁发证书。具体实现时,我们可以使用一个数组记录每个人是否拿到了证书,初始时都为 false。然后依次遍历每个人,如果该人的得分比前面的人高,但是前面的人没有拿到证书,就将证书颁发给前面的人。如果该人的得分比后面的人低,但是后面的人已经拿到了证书,就将证书颁发给该人。然后再次遍历所有人,如果发现某个人不满意且还没有拿到证书,就给他颁发证书,并将其他人的状态重置。
以下是一份使用 C++ 实现的代码,时间复杂度为 $O(n^2)$,可以通过此题:
```cpp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.rbegin(), a.rend()); // 从大到小排序
vector<bool> has_cert(n, false); // 初始时都没有证书
for (int i = 0; i < k; i++) {
has_cert[i] = true; // 颁发给排名靠前的 k 个人证书
}
int ans = k;
bool flag = true;
while (flag) {
flag = false;
for (int i = k; i < n; i++) {
if (!has_cert[i]) { // 如果该人还没有拿到证书
bool satisfied = true;
for (int j = 0; j < i; j++) {
if (a[i] > a[j] && !has_cert[j]) { // 检查前面的人是否满意
satisfied = false;
break;
}
}
if (satisfied) { // 如果该人满意
has_cert[i] = true; // 颁发证书
ans++;
flag = true;
break;
}
satisfied = true;
for (int j = i+1; j < n; j++) {
if (a[i] < a[j] && has_cert[j]) { // 检查后面的人是否满意
satisfied = false;
break;
}
}
if (satisfied) { // 如果该人满意
has_cert[i] = true; // 颁发证书
ans++;
flag = true;
break;
}
}
}
if (flag) { // 如果有人拿到了证书,需要重置其他人的状态
for (int i = 0; i < n; i++) {
if (!has_cert[i]) {
bool satisfied = true;
for (int j = 0; j < n; j++) {
if (a[i] > a[j] && !has_cert[j]) { // 检查前面的人是否满意
satisfied = false;
break;
}
}
if (satisfied) { // 如果该人满意
has_cert[i] = true; // 颁发证书
ans++;
}
}
}
}
}
cout << ans << endl;
return 0;
}
```
该程序使用了一个名为 `has_cert` 的数组记录每个人是否拿到了证书,初始时都为 false。首先给排名靠前的 $k$ 个人颁发证书,然后依次遍历每个人,检查他是否满意,如果不满意,就给他颁发证书,并检查其他人是否不满意,重复这个过程直到没有人不满意为止。
希望这个代码对您有所帮助。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)