P7072 [CSP-J2020] 直播获奖 题解

panda-lyl / 2024-11-13 / 原文

暴力

使用 \(\Theta (n^2)\) 的时间复杂度来解决这题大约能拿到 \(60pts\).

即枚举 \(p\),再枚举每个选手的分数.

正解

桶是个好东西.我们开一个桶,记录当前分数有多少人.

然后计算获奖人数,分数从大到小进行枚举,直到当前人数 \(\ge\) 获奖人数.

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>

using namespace std;

int n, w, t, c[603];

int main() {
	scanf("%d%d", &n, &w);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &t);
		c[t]++; // 当分数为 t 时的人数
		int sum = 0;
		for (int j = 600; j >= 0; j--) { // 从大到小枚举
			if (c[j]) { // 当前分数有人
				sum += c[j]; // 加上人数
				if (sum >= max(1, i * w / 100)) { // 到达边界
					printf("%d ", j); // 输出分数线
					break; // 退出循环.
				}
			}
		}
	}
	return 0;
}