【题解】 [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;
}

posted @ 2024-07-15 07:57  T_泓  阅读(108)  评论(0编辑  收藏  举报