【题解】 [CSP-J 2020 T2] 直播获奖
题目描述
题目大意
每次给出一个成绩,实时更新分数线。获奖率为 \(w \%\),计划获奖人数为 \(max(1, \left \lfloor p * w \% \right \rfloor )\),其中 \(p\) 为当前成绩个数。
思路
题目主要考察:数组计数
用数组记录每个分数的出现次数。每次从大到小(即从600到0)遍历,并累加当前分数的出现次数:
- 如果超出了计划获奖人数,则输出当前分数,停止遍历。
- 否则,继续往后累加。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 605;
int n, w;
int cnt[N]; // cnt数组用于记录每种分数的出现次数
int main()
{
scanf("%d%d", &n, &w);
for (int p = 1; p <= n; p ++ )
{
int x; scanf("%d", &x);
cnt[x] ++ ;
int sum = 0; // sum用于累加分数出现次数
for (int i = 600; i >= 0; i -- ) // 从大到小遍历每种分数
{
sum += cnt[i]; // 累加当前分数出现次数
if (sum >= max(1, p * w / 100)) // 如果超过计划获奖人数
{
printf("%d ", i); // 输出当前分数
break; // 退出遍历
}
}
}
return 0;
}