原題連結:https://www.luogu.com.cn/problem/P7072
題意解讀:每增加一個人的分數,計算一次當前獲獎的人數,輸出當前的分數線。
解題思路:
最多人數為N = 100000, 分數最高為M = 600
1、O(N*N*logN)做法
每增加一個人,對已出現的分數進行排序N*logN,計算獲獎人數k,取排名第k的人的分數,大概可以得到50分。
2、O(N*N)的做法
每增加一個人,採用插入排序的方式,將其排到合適位置,保持分數從大到小排序,然後計算獲獎人數k,取排名第k的人的分數,大概可以得到85分。
3、O(N*M)的做法
由於分數最大隻有600,可以用雜湊陣列記錄每個分數的人數,每增加一個人更新一次,然後從分數高到低600~0遍歷雜湊陣列,計算排在前面的總人數,一旦人數超過獲獎人數,則輸出分數。
100分程式碼:
#include <bits/stdc++.h>
using namespace std;
int n, w;
int a[605];
int main()
{
cin >> n >> w;
int x;
for(int i = 1; i <= n; i++)
{
cin >> x;
a[x]++;
int cnt = 0;
for(int j = 600; j >= 0; j--)
{
cnt += a[j];
if(cnt >= max(1, i * w / 100))
{
cout << j << " ";
break;
}
}
}
return 0;
}