zl程序教程

您现在的位置是:首页 >  其它

当前栏目

1 奥运排行榜

排行榜 奥运
2023-09-14 09:01:32 时间

1 奥运排行榜

分数 25
作者 陈越
单位 浙江大学

每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同。比如中国金牌总数列第一的时候,中国媒体就公布“金牌榜”;而美国的奖牌总数第一,于是美国媒体就公布“奖牌榜”。如果人口少的国家公布一个“国民人均奖牌榜”,说不定非洲的国家会成为榜魁…… 现在就请你写一个程序,对每个前来咨询的国家按照对其最有利的方式计算它的排名。

输入格式:

输入的第一行给出两个正整数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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C++ (g++)

思路:

我们用结构体存放每个国家的金牌数、奖牌数、人口数、人均金牌数、人均奖牌数、每种排名方式的排名、最后要选取的方式。
根据题目写四个比较方法。
输入每个国家的金牌数、奖牌数、人口数,然后计算出人均金牌数、人均奖牌数。
然后四种方式排序,注意这里有相等的情况。
然后选择合适的排序方式。
最后按格式输入输出查询的国家及其查询结果。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef struct Nation{
    int index;
    int gold;
    int cnt;
    int people;
    double avegold;
    double avecnt;
    int pos[5];
    int final;
}Nation;

Nation na[225];

bool cmp1(Nation n1,Nation n2){
    return n1.gold>n2.gold;
}
bool cmp2(Nation n1,Nation n2){
    return n1.cnt>n2.cnt;
}
bool cmp3(Nation n1,Nation n2){
    return n1.avegold>n2.avegold;
}
bool cmp4(Nation n1,Nation n2){
    return n1.avecnt>n2.avecnt;
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        na[i].index=i;
        cin>>na[i].gold>>na[i].cnt>>na[i].people;
        if(na[i].people){
            na[i].avegold=na[i].gold*1.0/na[i].people;
            na[i].avecnt=na[i].cnt*1.0/na[i].people;
            }
    }
    sort(na,na+n,cmp1);
    na[0].pos[1]=1;
    for(int i=1;i<n;i++){
        if(na[i].gold==na[i-1].gold){
            na[i].pos[1]=na[i-1].pos[1];
        }else{
            na[i].pos[1]=i+1;
        }
    }
    sort(na,na+n,cmp2);
    na[0].pos[2]=1;
    for(int i=1;i<n;i++){
        if(na[i].cnt==na[i-1].cnt){
            na[i].pos[2]=na[i-1].pos[2];
        }else{
            na[i].pos[2]=i+1;
        }
    }
    sort(na,na+n,cmp3);
    na[0].pos[3]=1;
    for(int i=1;i<n;i++){
        if(na[i].avegold==na[i-1].avegold){
            na[i].pos[3]=na[i-1].pos[3];
        }else{
            na[i].pos[3]=i+1;
        }
    }
    sort(na,na+n,cmp4);
    na[0].pos[4]=1;
    for(int i=1;i<n;i++){
        if(na[i].avecnt==na[i-1].avecnt){
            na[i].pos[4]=na[i-1].pos[4];
        }else{
            na[i].pos[4]=i+1;
        }
    }
    for(int i=0;i<n;i++){
        int final;
        int minx=225;
        for(int j=1;j<=4;j++){
            if(na[na[i].index].pos[j]<minx){
                minx=na[na[i].index].pos[j];
                final=j;
            }
        }
        na[na[i].index].final=final;
    }
    int index;
    for(int i=0;i<m;i++){
        cin>>index;
        for(int j=0;j<n;j++){
            if(na[j].index==index){
                if(i>0)
                    cout<<" ";
                cout<<na[j].pos[na[j].final]<<":"<<na[j].final;
                break;
            }
        }
    }
    return 0;
}