1085 PAT單位排行 25 分

2021-10-20 13:30:17 字數 2087 閱讀 7655

每次 pat 考試結束後,考試中心都會發布乙個考生單位排行榜。本題就請你實現這個功能。

輸入格式:

輸入第一行給出乙個正整數 n(n≤1

05

n≤10^5

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

思路

1080題一樣相同的關於stl庫的綜合操作練習,換湯不換藥。值得注意的是在處理總成績的時候要注意技巧。

這個題第一次提交第五個測試資料報錯,找了15分鐘原因,發現就是總成績的處理出現了問題,錯誤的操作行為是:每次對輸入的成績進行分等級的求加權分數,錯就錯在如果每次操作的資料都有小數,則每次操作都被捨掉,會導致最終總成績地域只保留整數的實際總成績。例如5個1.2分,先求和再捨去就是6分,先捨去再求和就是5分,差了1分。尤其資料量大的時候乙個乙個帶入的誤差會更大。同時,又為了避免結構體過於複雜(顯然定義三個常量來分別儲存三種情況沒有必要),採用的操作是在進行計算總分的時候不進行捨去操作,而是把總分用浮點型來計算,最後再把所有學校的得分捨掉小數換成整數進行排序然後輸出

主要的難點、坑,就是處理總分的時候應先求和;最後,也就是排序前,進行小數捨去。

ac例程

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

struct node

;string change

(string s)

return ss;

}bool

cmp(node a,node b)

intmain()

if(!mp.

count

(uni)

)else

}for

(int k=

0;ksize()

;k++

)sort

(vi.

begin()

,vi.

end(

),cmp)

;cout

int k=

0,c=

0;ksize()

;k++);

return0;

}

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代表...