【刷题笔记】2020 CSP-J

2020 CSP-J 题目整理

B-直播获奖

思路梳理

题目中说“如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实际获奖人数可能比计划中多”,这是一个坑点,因为即使有分数相同的人,他的分数也是和位于第 \(n*w\%\) 人的分数相同的,而题目只让输出分数,所以不用在意。先来考虑暴力算法,没加进去一个人就拍一次序,然后输出第 \(max(n*w\%,1)\) 的成绩,时间复杂度为 \(O(n^2logn)\) 还是会炸,但是注意题目中的特殊性质"每个选手的成绩均为不超过600的非负整数",那么为什么不开一个桶呢,其中 \(f[i]\) 记录分数为 \(i\) 的人的个数,这样只需要从 \(600\) 倒序循环到 \(0\) ,只要人数总和一大于限制,就 \(break\) 然后输出此时的分数

代码实现

#include<bits/stdc++.h>
#define maxn 1000
using namespace std;
int n,w;
int cnt[maxn];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>w;
    for(int i=1;i<=n;i++){
        int x,tot=0;
        cin>>x;
        ++cnt[x];
        for(int j=600;j>=0;j--){
            tot+=cnt[j];
            if(tot>=max(i*w/100,1)){
                cout<<j<<' ';
                break;
            }
        }
    }
    return 0;
}
posted @ 2024-09-23 22:26  SDFZ_GuoSN  阅读(16)  评论(0编辑  收藏  举报