7-40 奥运排行榜 (25 分)(详解+思路+map+vector做法)兄弟们冲压呀呀呀呀呀呀呀
一:題目
每年奧運(yùn)會(huì)各大媒體都會(huì)公布一個(gè)排行榜,但是細(xì)心的讀者發(fā)現(xiàn),不同國(guó)家的排行榜略有不同。比如中國(guó)金牌總數(shù)列第一的時(shí)候,中國(guó)媒體就公布“金牌榜”;而美國(guó)的獎(jiǎng)牌總數(shù)第一,于是美國(guó)媒體就公布“獎(jiǎng)牌榜”。如果人口少的國(guó)家公布一個(gè)“國(guó)民人均獎(jiǎng)牌榜”,說(shuō)不定非洲的國(guó)家會(huì)成為榜魁…… 現(xiàn)在就請(qǐng)你寫一個(gè)程序,對(duì)每個(gè)前來(lái)咨詢的國(guó)家按照對(duì)其最有利的方式計(jì)算它的排名。
輸入格式:
輸入的第一行給出兩個(gè)正整數(shù)N和M(≤224,因?yàn)槭澜缟瞎灿?24個(gè)國(guó)家和地區(qū)),分別是參與排名的國(guó)家和地區(qū)的總個(gè)數(shù)、以及前來(lái)咨詢的國(guó)家的個(gè)數(shù)。為簡(jiǎn)單起見,我們把國(guó)家從0 ~ N?1編號(hào)。之后有N行輸入,第i行給出編號(hào)為i?1的國(guó)家的金牌數(shù)、獎(jiǎng)牌數(shù)、國(guó)民人口數(shù)(單位為百萬(wàn)),數(shù)字均為[0,1000]區(qū)間內(nèi)的整數(shù),用空格分隔。最后面一行給出M個(gè)前來(lái)咨詢的國(guó)家的編號(hào),用空格分隔。
輸出格式:
在一行里順序輸出前來(lái)咨詢的國(guó)家的排名:計(jì)算方式編號(hào)。其排名按照對(duì)該國(guó)家最有利的方式計(jì)算;計(jì)算方式編號(hào)為:金牌榜=1,獎(jiǎng)牌榜=2,國(guó)民人均金牌榜=3,國(guó)民人均獎(jiǎng)牌榜=4。輸出間以空格分隔,輸出結(jié)尾不能有多余空格。
若某國(guó)在不同排名方式下有相同名次,則輸出編號(hào)最小的計(jì)算方式。
輸入樣例:
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二:思路
根據(jù)輸入的 金牌數(shù) 獎(jiǎng)牌數(shù) 國(guó)民總數(shù) 用vector容器進(jìn)行存儲(chǔ)四種計(jì)算排名的方式 將其得分兩次存儲(chǔ) 一次用于排序,一次用于記錄查旬國(guó)家信息的四種排名的成績(jī),(為什么要分兩次呢,因?yàn)橛昧藄ort排序一旦用一次后其順序都變了,只能查詢第一個(gè)準(zhǔn)確,接下來(lái) 均不準(zhǔn)確)計(jì)算四種排名方式的 排名 然后用map容器進(jìn)行存儲(chǔ)<排名方式,排名>
三:知識(shí)速遞(向map和vector這么好用的容器如果兄弟們還不了解,可以點(diǎn)鏈接學(xué)習(xí)一下哈)
map的基本用法
vector的基本用法
四:上碼
/**思路:根據(jù)輸入的 金牌數(shù) 獎(jiǎng)牌數(shù) 國(guó)民總數(shù) 計(jì)算四種排名方式的 排名然后用map容器進(jìn)行存儲(chǔ)<排名方式,排名> */ #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;//用于處理 原始數(shù)據(jù) v1.push_back(a);v2.push_back(b);v3.push_back(gold_medal);v4.push_back(medal);//用于處理 排序后的數(shù)據(jù) v11.push_back(a);v22.push_back(b);v33.push_back(gold_medal);v44.push_back(medal); } for( int i = 0; i < M; i++ ){//輸入要查詢的國(guó)家序號(hào) int temp;cin >> temp;//記錄該國(guó)家四種排序方式的成績(jī) double number1 = v1[temp];double number2 = v2[temp]; double number3 = v3[temp]; double number4 = v4[temp]; //cout << number1 << ' ' << number2 << ' ' << number3 << ' ' << number4 <<endl; //排序 將該國(guó)的成績(jī)進(jìn)行排序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容器進(jìn)行存儲(chǔ)<排名,排名方式> 利用map當(dāng)中鍵值不允許有重復(fù)的特性 // 用于處理不同排名方式當(dāng)中卻有著相同的名次,選擇較小的排序方式 map<double,double>m;map<double,double>::iterator t;//一個(gè)國(guó)家的四種排名方式均排完了 找出四種排名方式當(dāng)中最靠前的// 先拿方式大的放到前面,這是為了解決不同排名方式當(dāng)中卻有著相同的名次//這樣的話,后面有相同的名次,但其方式是比其小的,故直接覆蓋。//還有的話是N-i;因?yàn)槲覀兪沁x擇(拿金牌數(shù)舉例)金牌數(shù)多的為第一名//但其卻排到最后,比如給出的示例當(dāng)中,金牌最多的排到了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 << "金牌總數(shù)" << 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!!!!!!!!!!!!!!!
總結(jié)
以上是生活随笔為你收集整理的7-40 奥运排行榜 (25 分)(详解+思路+map+vector做法)兄弟们冲压呀呀呀呀呀呀呀的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: numpy怎么安装电脑如何下载numpy
- 下一篇: java当中用UDP实现相互交流