【刷题笔记】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;
}