7-40 奥运排行榜 (25 分)(详解+思路+map+vector做法)兄弟们冲压呀呀呀呀呀呀呀
一:題目
每年奧運會各大媒體都會公布一個排行榜,但是細心的讀者發現,不同國家的排行榜略有不同。比如中國金牌總數列第一的時候,中國媒體就公布“金牌榜”;而美國的獎牌總數第一,于是美國媒體就公布“獎牌榜”。如果人口少的國家公布一個“國民人均獎牌榜”,說不定非洲的國家會成為榜魁…… 現在就請你寫一個程序,對每個前來咨詢的國家按照對其最有利的方式計算它的排名。
輸入格式:
輸入的第一行給出兩個正整數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二:思路
根據輸入的 金牌數 獎牌數 國民總數 用vector容器進行存儲四種計算排名的方式 將其得分兩次存儲 一次用于排序,一次用于記錄查旬國家信息的四種排名的成績,(為什么要分兩次呢,因為用了sort排序一旦用一次后其順序都變了,只能查詢第一個準確,接下來 均不準確)計算四種排名方式的 排名 然后用map容器進行存儲<排名方式,排名>
三:知識速遞(向map和vector這么好用的容器如果兄弟們還不了解,可以點鏈接學習一下哈)
map的基本用法
vector的基本用法
四:上碼
/**思路:根據輸入的 金牌數 獎牌數 國民總數 計算四種排名方式的 排名然后用map容器進行存儲<排名方式,排名> */ #include<bits/stdc++.h> using namespace std;int main(){int N,M,flag = 0;vector<double>v1,v2,v11,v22;vector<double>v3,v4,v33,v44;cin >> N >> M;for( int i = 0; i < N; i++ ){int a,b,c;cin >> a >> b >> c;double gold_medal = (double) a / c;double medal = (double) b / c;//用于處理 原始數據 v1.push_back(a);v2.push_back(b);v3.push_back(gold_medal);v4.push_back(medal);//用于處理 排序后的數據 v11.push_back(a);v22.push_back(b);v33.push_back(gold_medal);v44.push_back(medal); } for( int i = 0; i < M; i++ ){//輸入要查詢的國家序號 int temp;cin >> temp;//記錄該國家四種排序方式的成績 double number1 = v1[temp];double number2 = v2[temp]; double number3 = v3[temp]; double number4 = v4[temp]; //cout << number1 << ' ' << number2 << ' ' << number3 << ' ' << number4 <<endl; //排序 將該國的成績進行排序if( flag == 0){sort(v11.begin(),v11.end());sort(v22.begin(),v22.end());sort(v33.begin(),v33.end());sort(v44.begin(),v44.end());flag = 1;}//用map容器進行存儲<排名,排名方式> 利用map當中鍵值不允許有重復的特性 // 用于處理不同排名方式當中卻有著相同的名次,選擇較小的排序方式 map<double,double>m;map<double,double>::iterator t;//一個國家的四種排名方式均排完了 找出四種排名方式當中最靠前的// 先拿方式大的放到前面,這是為了解決不同排名方式當中卻有著相同的名次//這樣的話,后面有相同的名次,但其方式是比其小的,故直接覆蓋。//還有的話是N-i;因為我們是選擇(拿金牌數舉例)金牌數多的為第一名//但其卻排到最后,比如給出的示例當中,金牌最多的排到了3,所以4 - 3 = 1;第一名; for( int i = 0; i < N; i++ ){//即按排名方式4的 排名為 N-i;if( v44[i] == number4 ){m[N-i] = 4; }//即按排名方式3的 排名為 N-i;if(v33[i] == number3) {m[N-i] = 3;}//即按排名方式2的 排名為 N-i;if( v22[i] == number2 ){m[N-i] = 2;}//即按排名方式1的 排名為 N-i;if( v11[i] == number1){//cout << "金牌總數" << v1[i] << endl; m[N-i] = 1;//cout << "金牌排名:" << i+1 << endl; } } if( i == M - 1){t = m.begin(); cout << t->first << ':' << t->second; }else{t = m.begin(); cout << t->first << ':' << t->second << ' ';} } }//4 2 //51 100 1000 //36 110 300 //6 14 32 //5 18 40 //0 1
加油boy!!!!!!!!!!!!!!!
總結
以上是生活随笔為你收集整理的7-40 奥运排行榜 (25 分)(详解+思路+map+vector做法)兄弟们冲压呀呀呀呀呀呀呀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy怎么安装电脑如何下载numpy
- 下一篇: java当中用UDP实现相互交流