題目鏈接:https://www.luogu.com.cn/problem/P7072
方法一: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 }