信息学奥赛一本通 2005:【20CSPJ普及组】直播获奖 | 洛谷 P7072 [CSP-J2020] 直播获奖
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 2005:【20CSPJ普及组】直播获奖 | 洛谷 P7072 [CSP-J2020] 直播获奖
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
ybt 2005:【20CSPJ普及組】直播獲獎
洛谷 P7072 [CSP-J2020] 直播獲獎
【題目考點】
其核心為:設計數數組c,c[i]表示數字i出現的個數
遍歷計數數組c,即可得到排序。
計數排序只能對范圍有限的整數進行排序
【解題思路】
- 該題突破點在于“每個選手的成績均為不超過600的非負整數”,整數,且范圍有限,適合使用計數排序。
- 題目要求每增加一個數據后,都要得到數據列表中第?p?w/100?\lfloor p\cdot w/100 \rfloor?p?w/100?個元素。
需要維護一個計數數組,循環n次,每次在計數數組中添加一個數字,而后查找值?p?w/100?\lfloor p\cdot w/100 \rfloor?p?w/100?的最后一次出現的位置。 - 【復雜度】記k為分數的范圍,遍歷計數數組查找值位置的復雜度為O(k),循環n次, 總復雜度為O(nk)O(nk)O(nk),題目給定n最大為10510^5105,k為600,n?k<107n\cdot k < 10^7n?k<107,那么O(nk)O(nk)O(nk)是可以接受的復雜度。
- 【注意 輸入輸出】: 由于要輸出10510^5105數量級個的數據,所以不能使用cin和cout,只能使用scanf與printf。
【題解代碼】
#include<bits/stdc++.h> using namespace std; int c[700];//計數數組 c[i]表示分數i出現的個數 int main() {int n, w, g, i, j, p, c[700]={};//j:分數線scanf("%d %d", &n, &w);//n:人數 w:百分比 for(int i = 1; i <= n; ++i)//當前有i個人{cin >> g;//輸入分數 c[g]++;//分數g的個數增加1 p = max(1, i * w / 100);//此時獲獎的是p個人for(j = 600; j >= 0; --j)//尋找分數線,即第p人的分數,已知分數不超過600{//降序排列,先看高分再看低分 p -= c[j];//分數為j的人有c[j]人,p減少j人。p表示還要看幾個人。 if(p <= 0)break;//此時j是分數線}printf("%d ", j);}return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通 2005:【20CSPJ普及组】直播获奖 | 洛谷 P7072 [CSP-J2020] 直播获奖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1090:含k个3的数
- 下一篇: 信息学奥赛一本通 1095:数1的个数