奧運排行榜

xcdq發表於2020-12-05

每年奧運會各大媒體都會公佈一個排行榜,但是細心的讀者發現,不同國家的排行榜略有不同。比如中國金牌總數列第一的時候,中國媒體就公佈“金牌榜”;而美國的獎牌總數第一,於是美國媒體就公佈“獎牌榜”。如果人口少的國家公佈一個“國民人均獎牌榜”,說不定非洲的國家會成為榜魁…… 現在就請你寫一個程式,對每個前來諮詢的國家按照對其最有利的方式計算它的排名。

輸入格式:
輸入的第一行給出兩個正整數N和M(≤224,因為世界上共有224個國家和地區),分別是參與排名的國家和地區的總個數、以及前來諮詢的國家的個數。為簡單起見,我們把國家從0 ~ N−1編號。之後有N行輸入,第i行給出編號為i−1的國家的金牌數、獎牌數、國民人口數(單位為百萬),數字均為[0,1000]區間內的整數,用空格分隔。最後面一行給出M個前來諮詢的國家的編號,用空格分隔。

輸出格式:
在一行裡順序輸出前來諮詢的國家的排名:計算方式編號。其排名按照對該國家最有利的方式計算;計算方式編號為:金牌榜=1,獎牌榜=2,國民人均金牌榜=3,國民人均獎牌榜=4。輸出間以空格分隔,輸出結尾不能有多餘空格。

若某國在不同排名方式下有相同名次,則輸出編號最小的計算方式。

輸入樣例:
4 4
51 100 1000
36 110 300
6 14 32
5 18 40
0 1 2 3
輸出樣例:
1:1 1:2 1:3 1:4

解題

很繁瑣的一道題,要注意的是相同排名的情況
每次排序的時候順序都要打亂的,所以最後還要根據m的順序排序,這裡可以再在結構體裡設定一個變數,存在m輸入時的順序。其它的都設定成1000(比224大就行)然後排序的時候它們自然而然的到前面了

程式碼

#include<iostream>
#include<algorithm>
using namespace std;
struct country {
    int id, relId;//n輸入時的id,m輸入時的id
    int jin, all, people;//金牌,獎牌,人
    int mingci, fangfa;//名次,方法
} cou[250];

bool cmp1(country a, country b) {//第一種排序,一下類推
    return a.jin > b.jin;
}
bool cmp2(country a, country b) {
    return a.all > b.all;
}
bool cmp3(country a, country b) {
    return (double) a.jin / a.people > (double) b.jin / b.people;
}
bool cmp4(country a, country b) {
    return (double) a.all / a.people > (double) b.all / b.people;
}
bool cmp(country a, country b) {//按照m輸入時的id排序
    return a.relId < b.relId;
}

bool check(country a, country b, int k) {//用於判斷是否相等,k為判斷的方法
    if (k == 1) {
        return a.jin == b.jin;
    } else if (k == 2) {
        return a.all == b.all;
    } else if (k == 3) {
        return (double) a.jin / a.people == (double) b.jin / b.people;
    } else if (k == 4) {
        return (double) a.all / a.people == (double) b.all / b.people;
    }
    return false;
}
void give(int n, int k) {//將排好的順序給輸入到結構體陣列中
    int mc;//名次
    for (int i = 0; i < n; ++i) {
        if (i == 0) {
            mc = i;
        } else if (!check(cou[i], cou[i - 1], k)) {
            mc = i;
        }//如果不相等才修改
        if (cou[i].mingci > mc) {
            cou[i].mingci = mc;
            cou[i].fangfa = k;
        }
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        cin >> cou[i].jin >> cou[i].all >> cou[i].people;//輸入
        cou[i].id = i;
        cou[i].relId = 1000;
    }
    for (int i = 0; i < m; i++) {
        int temp;
        cin >> temp;
        cou[temp].relId = i;
        cou[temp].mingci = 1000;//初始值,之後一次排序後就修改了
    }
    sort(cou, cou + n, cmp1);give(n, 1);
    sort(cou, cou + n, cmp2);give(n, 2);
    sort(cou, cou + n, cmp3);give(n, 3);
    sort(cou, cou + n, cmp4);give(n, 4);
    sort(cou, cou + n, cmp);
    for (int i = 0; i < m; ++i) {
        if (i != 0)cout << " ";
        cout << (cou[i].mingci + 1) << ":" << cou[i].fangfa;
    }
}

相關文章