每次 pat 考試結束後,考試中心都會發布乙個考生單位排行榜。本題就請你實現這個功能。
輸入格式
輸入第一行給出乙個正整數 n(≤10^5),即考生人數。隨後 n 行,每行按下列格式給出乙個考生的資訊:
准考證號 得分 學校
其中准考證號
是由 6 個字元組成的字串,其首字母表示考試的級別:b
代表乙級,a
代表甲級,t
代表頂級;得分
是 [0, 100] 區間內的整數;學校
是由不超過 6 個英文本母組成的單位碼(大小寫無關)。注意:題目保證每個考生的准考證號是不同的。
輸出格式
首先在一行中輸出單位個數。隨後按以下格式非降序輸出單位的排行榜:
排名 學校 加權總分 考生人數
其中排名
是該單位的排名(從 1 開始);學校
是全部按小寫字母輸出的單位碼;加權總分
定義為乙級總分/1.5 + 甲級總分 + 頂級總分*1.5
的整數部分;考生人數
是該屬於單位的考生的總人數。
學校首先按加權總分排行。如有並列,則應對應相同的排名,並按考生人數公升序輸出。如果仍然並列,則按單位碼的字典序輸出。
輸入樣例
10
a57908 85 au
b57908 54 lanx
a37487 60 au
t28374 67 cmu
t32486 24 hypu
a66734 92 cmu
b76378 71 au
a47780 45 lanx
a72809 100 pku
a03274 45 hypu
輸出樣例
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2
用乙個map sc表示學校名與學校對應的結構體,結構體包含人數count,浮點分數all,整數分數a
輸入資料應先將學校名全部轉為小寫,到sc中根據id的第乙個字元(a,b,t)判斷加分的方法
由於map本身有序,需要將map元素取出放進vector自定義排序輸出,這裡排名需要單獨處理,同分的排名一樣,用乙個從1開始的rank,若當前的結點的分數的整數部分(a)等於上乙個結點的分數,則rank不動輸出,否則rank等於該結點所在的位置 + 1(從0開始),然會輸出rank
注意這裡在求分數之和的時候應使用double,最後再將double存進int取整數部分
#include#include#include#include#include#include#includeusing namespace std;
struct n ;
mapsc;
bool cmp(pairl,pairr)else if(l.second.count != r.second.count)else
}int main()
sc[s].count++;//某學校人數++
switch(id[0])
}vector< pair> v(sc.begin(),sc.end());
for(int i = 0 ; i < v.size() ; i ++)
sort(v.begin(),v.end(),cmp);
cout << v.size() << endl;
int rank = 1;
for(int i = 0 ; i < v.size() ; i ++)
}
1085 PAT單位排行(25 分)
我是卡在了最後乙個測試點。也就是 測試點 5 不是執行超時的問題,反而是答案錯誤。花了我好長時間終於發現了問題 是這樣。因為最後答案要求 加權總分定義為乙級總分 1.5 甲級總分 頂級總分 1.5的整數部分 我也注意到最後輸出是整數部分。但是我忘記了比較的時候!我用double與double 比較 ...
1085 PAT單位排行 (25 分
每次 pat 考試結束後,考試中心都會發布乙個考生單位排行榜。本題就請你實現這個功能。輸入格式 輸入第一行給出乙個正整數 n 10 5 即考生人數。隨後 n 行,每行按下列格式給出乙個考生的資訊 准考證號 得分 學校 其中准考證號是由 6 個字元組成的字串,其首字母表示考試的級別 b代表乙級,a代表...
1085 PAT單位排行 25 分
每次 pat 考試結束後,考試中心都會發布乙個考生單位排行榜。本題就請你實現這個功能。輸入第一行給出乙個正整數 n 10 5 即考生人數。隨後 n 行,每行按下列格式給出乙個考生的資訊 准考證號 得分 學校其中准考證號是由 6 個字元組成的字串,其首字母表示考試的級別 b代表乙級,a代表甲級,t代表...