宋代史學家司馬光在《資治通鑑》中有一段著名的「德才論」:「是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。」
現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。
輸入第一行給出 3 個正整數,分別為:n(≤),即考生總數;l(≥),為錄取最低分數線,即德分和才分均不低於 l 的考生才有資格被考慮錄取;h(<),為優先錄取線——德分和才分均不低於此線的被定義為「才德全盡」,此類考生按德才總分從高到低排序;才分不到但德分到線的一類考生屬於「德勝才」,也按總分排序,但排在第一類考生之後;德才分均低於 h,但是德分不低於才分的考生屬於「才德兼亡」但尚有「德勝才」者,按總分排序,但排在第二類考生之後;其他達到最低線 l 的考生也按總分排序,但排在第三類考生之後。
隨後 n 行,每行給出一位考生的資訊,包括:准考證號 德分 才分
,其中准考證號
為 8 位整數,德才分為區間 [0, 100] 內的整數。數字間以空格分隔。
輸出第一行首先給出達到最低分數線的考生人數 m,隨後 m 行,每行按照輸入格式輸出一位考生的資訊,考生按輸入中說明的規則從高到低排序。當某類考生中有多人總分相同時,按其德分降序排列;若德分也並列,則按准考證號的公升序輸出。
思路:該題明顯考察排序,首先有乙個大方向,先構造乙個學生的結構體陣列(這類題的通解)。准考證號用字元陣列方便輸入輸出,除了德分和才分還需要乙個sum總分和這個學生的類別flag。
1struct
studentstu[maxn];
主函式讀入資料,讀入資料以後直接用sort函式排序即可,那這題實際上是怎樣構造sort函式裡的cmp函式的問題。
首先想到,要按類別排序,故在讀入資料時就進行類別(flag)的劃分,接著注意到,無論是哪一類,都是按總分排序,總分相同排德分,德分相同排准考證號,那cmp函式就寫完了。
注意准考證號是乙個字串,要用strcmp函式。
1bool
cmp(student a,student b)
注意主函式裡用來判斷類別的if else語句,情況要考慮全。
完整**:
1 #include2using
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...