方法一:50分代碼(時間復雜度為n*nlongn)
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n, w, a[100010], b[100010], p;
4 bool cmp(int x, int y){
5 return x>y;
6 }
7 int main(){
8 cin>>n>>w;
9 for(int i=0; i<n; i++){
10 cin>>a[i];
11 sort(a, a+i+1, cmp);//sort時間復雜度為nlogn 12 // for(int j=0; j<=i; j++)cout<<a[j]<<" ";
13 // cout<<endl;
14 p=max(1, (i+1)*w/100);
15 cout<<a[p-1]<<" ";
16 }
17 return 0;
18 }
方法二:計數排序(時間復雜度為n*s=O(100000*600))但仍然是85分,原因是第15行處沒有必要增加一層循環
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n, w, score, a[605], p;
4 int main()
5 {
6 cin>>n>>w;
7 for(int i=1; i<=n; i++){
8 cin>>score;
9 a[score]++;
10 p=max(1, i*w/100);
11 for(int s=605; s>=0; s--){
12 if(a[s]){
13 int t=a[s];//臨時存放該分數出現的次數,下次還要使用
14 int f=0;//判讀是否達到排名位數
15 while(t--){
16 p--;
17 if(p==0){
18 f=1;
19 break;
20 }
21 }
22 if(f){
23 cout<<s<<" ";
24 break;
25 }
26 }
27 }
28 }
29 return 0;
30 }
方法三:其實是對方法二的優化
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n, w, x, a[607];
4 int main() {
5 scanf("%d%d", &n, &w);
6 for(int i = 1; i <= n; ++i) {
7 scanf("%d", &x);
8 a[x]++;
9 int pl = max(1, i * w / 100);//獲獎人數
10 int num = 0;//記錄當前排名次
11 for(int j = 600; j >= 0; --j) {
12 num += a[j];
13 if(num >= pl) {
14 printf("%d ", j);//循環結束條件
15 break;
16 }
17 }
18 }
19 return 0;
20 }