题目描述
按要求,给国家进行排名。
输入描述:
有多组数据。 第一行给出国家数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; }