直播 獲獎(live)


題目鏈接: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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM