PAT 1015 德才論 (排序)

2022-09-09 03:18:07 字數 1707 閱讀 4655

宋代史學家司馬光在《資治通鑑》中有一段著名的「德才論」:「是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。」

現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。

輸入第一行給出 3 個正整數,分別為:n(≤),即考生總數;l(≥),為錄取最低分數線,即德分和才分均不低於 l 的考生才有資格被考慮錄取;h(<),為優先錄取線——德分和才分均不低於此線的被定義為「才德全盡」,此類考生按德才總分從高到低排序;才分不到但德分到線的一類考生屬於「德勝才」,也按總分排序,但排在第一類考生之後;德才分均低於 h,但是德分不低於才分的考生屬於「才德兼亡」但尚有「德勝才」者,按總分排序,但排在第二類考生之後;其他達到最低線 l 的考生也按總分排序,但排在第三類考生之後。

隨後 n 行,每行給出一位考生的資訊,包括:准考證號 德分 才分,其中准考證號為 8 位整數,德才分為區間 [0, 100] 內的整數。數字間以空格分隔。

輸出第一行首先給出達到最低分數線的考生人數 m,隨後 m 行,每行按照輸入格式輸出一位考生的資訊,考生按輸入中說明的規則從高到低排序。當某類考生中有多人總分相同時,按其德分降序排列;若德分也並列,則按准考證號的公升序輸出。

思路:該題明顯考察排序,首先有乙個大方向,先構造乙個學生的結構體陣列(這類題的通解)。准考證號用字元陣列方便輸入輸出,除了德分和才分還需要乙個sum總分和這個學生的類別flag。

1

struct

studentstu[maxn];

主函式讀入資料,讀入資料以後直接用sort函式排序即可,那這題實際上是怎樣構造sort函式裡的cmp函式的問題。

首先想到,要按類別排序,故在讀入資料時就進行類別(flag)的劃分,接著注意到,無論是哪一類,都是按總分排序,總分相同排德分,德分相同排准考證號,那cmp函式就寫完了。

注意准考證號是乙個字串,要用strcmp函式。

1

bool

cmp(student a,student b)

注意主函式裡用來判斷類別的if else語句,情況要考慮全。

完整**:

1 #include2

using

namespace

std;

3const

int maxn=100010;4

5struct

studentstu[maxn];910

bool

cmp(student a,student b)

1617

intmain()

28else

if(stu[i].d>=h&&stu[i].c>=h) stu[i].flag=1;29

else

if(stu[i].d>=h&&stu[i].c<=h) stu[i].flag=2;30

else

if(stu[i].d>=stu[i].c) stu[i].flag=3;31

else stu[i].flag=4;32

}33 m=n-m;

34 sort(stu,stu+n,cmp);

35 printf("

%d\n

",m);

36for(int i=0;i)

39 }

乙級 PAT 1015 德才論 25

宋代史學家司馬光在 資治通鑑 中有一段著名的 德才論 是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。輸入格式 輸入第1行給出3個正整數,分別為 n 105 ...

PAT1015 德才論 25 分

宋代史學家司馬光在 資治通鑑 中有一段著名的 德才論 是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。輸入格式 輸入第一行給出 3 個正整數,分別為 n 10...

PAT 1015 德才論 25分

本題鏈結 小tips c 實現 include include include include using namespace std struct student bool cmp student a,student b intmain numb,d,c都打包進結構體t if d gao c ga...