牛客网——奥运排序问题

题目描述

按要求,给国家进行排名。

输入描述:

有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。

输出描述:

排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。

链接:https://www.nowcoder.com/questionTerminal/100a4376cafc439b86f5f8791fb461f3
来源:牛客网

#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;
// define the info struct
struct country{
    country(int i=0, int gn=0, int mn=0, float gr=0, float mr=0):id(i),goldNum(gn),medalNum(mn),gratio(gr),mratio(mr)
    {
 
    }
public:
    int id;
    int goldNum;
    int medalNum;
    float gratio;
    float mratio;
};
//define four kinds of compare methods
bool cmp1(const country& A, const country& B){
    return A.goldNum>B.goldNum;
}
bool cmp2(const country& A, const country& B){
    return A.medalNum>B.medalNum;
}
bool cmp3(const country& A, const country& B){
    return A.gratio>B.gratio;
}
bool cmp4(const country& A, const country& B){
    return A.mratio>B.mratio;
}
//v is the vector returned, v[i] represent the rank of i country 
void mrank(vector<country> cs, int cmpNum, vector<int> & res){
     
    switch(cmpNum){
        case 1:
            sort(cs.begin(),cs.end(),cmp1);
            res[cs[0].id]=1;
            for(int i=1; i<cs.size(); i++){
                if(cs[i].goldNum==cs[i-1].goldNum)
                    res[cs[i].id]=res[cs[i-1].id];
                else
                    res[cs[i].id]=i+1;
            }
            break;
        case 2:
            sort(cs.begin(),cs.end(),cmp2);
            res[cs[0].id]=1;
            for(int i=1; i<cs.size(); i++){
                if(cs[i].medalNum==cs[i-1].medalNum)
                    res[cs[i].id]=res[cs[i-1].id];
                else
                    res[cs[i].id]=i+1;
            }
            break;
        case 3:
            sort(cs.begin(),cs.end(),cmp3);
            res[cs[0].id]=1;
            for(int i=1; i<cs.size(); i++){
                if(cs[i].gratio==cs[i-1].gratio)
                    res[cs[i].id]=res[cs[i-1].id];
                else
                    res[cs[i].id]=i+1;
            }
            break;
        case 4:
            sort(cs.begin(),cs.end(),cmp4);
            res[cs[0].id]=1;
            for(int i=1; i<cs.size(); i++){
                if(cs[i].mratio==cs[i-1].mratio)
                    res[cs[i].id]=res[cs[i-1].id];
                else
                    res[cs[i].id]=i+1;
            }
            break;
        default: break;
    }
}
int main(void){
    int cn,sn;
    while(scanf("%d %d",&cn,&sn)!=EOF){
        vector<country> cs(cn);
        int gn, mn, pn;
        for(int i=0; i<cn; i++){
            scanf("%d %d %d",&gn,&mn,&pn);
            cs[i].id=i;
            cs[i].goldNum=gn;
            cs[i].medalNum=mn;
 
            cs[i].gratio=(float)gn/pn;
            cs[i].mratio=(float)mn/pn;
            if(gn==0 && pn==0)
                cs[i].gratio=0;
            if(mn==0 && pn==0)
                cs[i].mratio=0;
             
        }
        vector<vector<int>> ranks(4, vector<int>(cn));
        for(int i=0; i<4; i++){
            mrank(cs,i+1,ranks[i]);
        }
        vector<int> ids(sn);
        vector<int> item(sn);
        vector<int> frank(sn);
        for(int i=0; i<sn; i++)
            scanf("%d",&ids[i]);
        int sni=0;
        for(int i=0; i<cs.size(); i++){
            if(i==ids[sni]){
                int minrank=0x7fffffff;
                int minitem=0x7fffffff;
                for(int j=0; j<4; j++){
                    if(minrank>ranks[j][i]){
                        minrank=ranks[j][i];
                        minitem=j+1;
                    }
                }
                item[sni]=minitem;
                frank[sni]=minrank;
                sni++;
                if(sni == ids.size())
                    break;
            }
        }
 
        for(int i=0; i<ids.size(); i++){
            printf("%d:%d\n",frank[i],item[i]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/JAYPARK/p/10362797.html