CSP歷年複賽題-P7072 [CSP-J2020] 直播獲獎

五月江城發表於2024-06-13

原題連結:https://www.luogu.com.cn/problem/P7072

題意解讀:每增加一個人的分數,計算一次當前獲獎的人數,輸出當前的分數線。

解題思路:

最多人數為N = 100000, 分數最高為M = 600

1、O(N*N*logN)做法

每增加一個人,對已出現的分數進行排序N*logN,計算獲獎人數k,取排名第k的人的分數,大概可以得到50分。

2、O(N*N)的做法

每增加一個人,採用插入排序的方式,將其排到合適位置,保持分數從大到小排序,然後計算獲獎人數k,取排名第k的人的分數,大概可以得到85分。

3、O(N*M)的做法

由於分數最大隻有600,可以用雜湊陣列記錄每個分數的人數,每增加一個人更新一次,然後從分數高到低600~0遍歷雜湊陣列,計算排在前面的總人數,一旦人數超過獲獎人數,則輸出分數。

100分程式碼:

#include <bits/stdc++.h>
using namespace std;

int n, w;
int a[605];

int main()
{
    cin >> n >> w;
    int x;
    for(int i = 1; i <= n; i++)
    {
        cin >> x;
        a[x]++;

        int cnt = 0;
        for(int j = 600; j >= 0; j--)
        {
            cnt += a[j];
            if(cnt >= max(1, i * w / 100))
            {
                cout << j << " ";
                break;
            }
        }
    }
    return 0;
}

相關文章