PAT-B 1085 PAT單位排行【模擬】
PAT-B 1085 PAT單位排行
https://pintia.cn/problem-sets/994805260223102976/problems/994805260353126400
題目
每次 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
分析
需要注意當加權總分一樣時如何排名,具體看程式。
C++程式
#include<iostream>
#include<algorithm>
#include<ctype.h>
#include<map>
using namespace std;
const int N=100005;
struct Node{
string school;//學校碼
double sum_B,sum_A,sum_T;//乙級、甲級、頂級總分
int num;//考生人數
int getscore()//獲取加權總分
{
return (int)(sum_B/1.5+sum_A+sum_T*1.5);
}
bool operator <(const Node &h)const
{
int v1=sum_B/1.5+sum_A+sum_T*1.5;
int v2=h.sum_B/1.5+h.sum_A+h.sum_T*1.5;
if(v1!=v2)
return v1>v2;//加權總分非降序
else//加權總分一樣
{
if(num!=h.num)//考生人數升序
return num<h.num;
else
return school<h.school; //單位碼的字典序
}
}
}a[N];
map<string,int>d;//記錄儲存學校碼的陣列下標
int main()
{
int n,k=0;
cin>>n;
while(n--)
{
string s1,s2;//准考證號和學校碼
double score;
cin>>s1>>score>>s2;
//將學校碼化為小寫
for(int i=0;i<s2.length();i++)
s2[i]=tolower(s2[i]);
int t;
if(d.count(s2))//如果已經存放過這個學校
t=d[s2];//獲取這個學校在a陣列中的下標
else//還未儲存過
{
t=k++;
d[s2]=t;//記錄這個學校存放的下標位置為t
}
a[t].school=s2;
a[t].num++;//考試人數加一
//統計分數
if(s1[0]=='B')
a[t].sum_B+=score;
else if(s1[0]=='A')
a[t].sum_A+=score;
else
a[t].sum_T+=score;
}
sort(a,a+k);
cout<<k<<endl;//輸出單位的個數
int pre_score=-1,pre_rank=0;//記錄前一個單位的總分和排名
for(int i=0;i<k;i++)
{
int rank=(a[i].getscore()==pre_score)?pre_rank:i+1;//獲取排名
cout<<rank<<" "<<a[i].school<<" "<<a[i].getscore()<<" "<<a[i].num<<endl;
pre_score=a[i].getscore();//為下一次輸出做準備
pre_rank=rank;
}
return 0;
}
相關文章
- PAT-B 1027 列印沙漏 【模擬】
- PAT-B 1012 數字分類【簡單模擬】
- PAT-B 1058 選擇題 【模擬】
- PAT-B 1061 判斷題【模擬】
- PAT-B 1067 試密碼【模擬】密碼
- PAT-B 1071 小賭怡情【模擬】
- PAT-B 1054 求平均值 【模擬】
- PAT-B 1072 開學寄語【模擬】
- PAT-B 1081 檢查密碼【模擬】密碼
- PAT-B 1084 外觀數列 【模擬】
- PAT-B 1018 錘子剪刀布 【模擬】
- PAT-B 1019 數字黑洞【陣列+模擬】陣列
- PAT-B 1017 A除以B【模擬 大數除法】
- PAT-B 1059 C語言競賽【模擬】C語言
- PAT-B 1008 陣列元素迴圈右移問題【簡單模擬】陣列
- PAT-B 1024 科學計數法【模擬+字串】字串
- PAT-B 1077 互評成績計算【模擬】
- PAT-B 1025 反轉連結串列【模擬+對映】
- PAT-B 1069 微博轉發抽獎【模擬+集合】
- PAT-B 1057 數零壹【進位制】
- PAT-B 1021 個位數統計【對映】
- PAT-B 1022 D進位制的A+B【進位制】
- PAT-B 1065 單身狗【對映+集合】
- PAT-B 1001 害死人不償命的(3n+1)猜想【模擬】
- PAT-B 1046 划拳
- PAT B1009 說反話(簡單模擬)
- PAT B1022 D進位制的A+B(進位制轉換板題,簡單模擬)
- 【PAT A1051】【棧/模擬】
- PAT-B 1064 朋友數
- PAT-B 1043 輸出PATest
- PAT-B 1051 複數乘法
- PAT-B 1052 賣個萌
- PAT-B 1076 Wifi密碼WiFi密碼
- PAT-B 1004 成績排名
- PAT-B 1015 德才論【排序】排序
- PAT-B 1016 部分A+B
- PAT-B 1020 月餅【貪心法】
- PAT-B 1023 組個最小數