1. 程式人生 > >牛客網——奧運排序問題

牛客網——奧運排序問題

space const != represent title end try subject bsp

題目描述

按要求,給國家進行排名。

輸入描述:

有多組數據。
第一行給出國家數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; }

牛客網——奧運排序問題