方法一: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 }