1. 程式人生 > 其它 >LuoguP7072 [CSP-J2020] 直播獲獎 題解

LuoguP7072 [CSP-J2020] 直播獲獎 題解

LuoguP7072 [CSP-J2020] 直播獲獎 題解

Update

  • \(\texttt{2020.11.13}\) 修改了一個小細節。
  • \(\texttt{2020.11.16}\) 修改了一個錯誤。

Content

有一場 \(n\) 個人的比賽,計劃獲獎人數為總人數的 \(w\%\)。第 \(i\) 個人的成績為 \(a_i\)。請求出在第 \(i\in[1,n]\) 個人出成績時的實時分數線。

資料範圍:\(n\leqslant 10^5,0\leqslant a_i\leqslant 600,1\leqslant w\leqslant 99\)

Solution

考場沒想出來,果然還是我太菜。

考慮開個大小為 \(600\) 的桶,然後在讀入第 \(i\)

個人的成績的時候邊將其分數放到相應的桶中,在按照分數 \(k\) 從大到小直接遍歷一遍,統計分數大於等於 \(k\) 的人的個數,直到這個數 \(\geqslant \max(1,\left\lfloor i\times w\%\right\rfloor)\) 為止,此時的 \(k\) 就是答案,輸出就好。

Code

int n, w, x, a[607];

int main() {
	scanf("%d%d", &n, &w);
	for(int i = 1; i <= n; ++i) {
		scanf("%d", &x);
		a[x]++;
		int pl = max(1, i * w / 100), num = 0;
		for(int j = 600; j >= 0; --j) {
			num += a[j];
			if(num >= pl) {printf("%d ", j); break;}
		}
	}
	return 0;
}