宋代史學家司馬光在《資治通鑑》中有一段著名的「德才論」:「是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。」
現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。
輸入格式:
輸入第1行給出3個正整數,分別為:n(<=105),即考生總數;l(>=60),為錄取最低分數線,即德分和才分均不低於l的考生才有資格被考慮錄取;h(<100),為優先錄取線——德分和才分均不低於此線的被定義為「才德全盡」,此類考生按德才總分從高到低排序;才分不到但德分到線的一類考生屬於「德勝才」,也按總分排序,但排在第一類考生之後;德才分均低於h,但是德分不低於才分的考生屬於「才德兼亡」但尚有「德勝才」者,按總分排序,但排在第二類考生之後;其他達到最低線l的考生也按總分排序,但排在第三類考生之後。
隨後n行,每行給出一位考生的資訊,包括:准考證號、德分、才分,其中准考證號為8位整數,德才分為區間[0, 100]內的整數。數字間以空格分隔。
輸出格式:
輸出第1行首先給出達到最低分數線的考生人數m,隨後m行,每行按照輸入格式輸出一位考生的資訊,考生按輸入中說明的規則從高到低排序。當某類考生中有多人總分相同時,按其德分降序排列;若德分也並列,則按准考證號的公升序輸出。
輸入樣例:
14 60 80輸出樣例:10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60
1210000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90
思路:因為每個學生的資訊較多,故採用結構體儲存
此題關鍵在於抓住兩個排序:
在德才達到及格線的基礎上
1.分數型別的排序,排序優先順序為:
(1)德才都不低於優秀線
(2)德不低於優秀線且才低於優秀線
(3)德才均低於優秀線且德高於才
(4)其他(德低於優秀線而才高於有優秀線,德才均低於優秀線且才高於德)
2.同一分數型別排序
(1)總分
(2)德
(3)考號
一、起始變數
1.n(人數)、l(及格線)、h(優秀線)
2.儲存學生資訊的結構體陣列
二、運算
1.錄入結構體陣列,並同時判斷是否具有錄取資格,即德才及格
2.分別按照四種成績的要求進行錄入
3.在每種成績內部進行排序
4.輸出
三、**
#include "stdio.h"
#include "stdlib.h"
typedef structstudent;
int cmp(const void * a, const void * b);
int main()
else
}//德才兼備
student vaa[n];
int countofvaa = 0;
//德勝才
student vana[n];
int countofvana = 0;
//尚可德勝才
student nvana[n];
int countofnvana = 0;
//其他
student base[n];
int countofbase = 0;
for(int i = 0; i < n; i++)
//德勝才
if(students[i].flag != 0 && students[i].virtue >= h && students[i].ability < h)
//尚可德勝才
if(students[i].flag != 0 && students[i].virtue < h && students[i].ability < h && students[i].virtue >= students[i].ability)
//其他
if(students[i].flag != 0)
}//四種成績內部排序
qsort(vaa,countofvaa,sizeof(vaa[0]),cmp);
qsort(vana,countofvana,sizeof(vana[0]),cmp);
qsort(nvana,countofnvana,sizeof(nvana[0]),cmp);
qsort(base,countofbase,sizeof(base[0]),cmp);
//輸出
printf("%d\n",countofvaa + countofvana + countofnvana + countofbase);
for(int i = 0; i < countofvaa; i++)
for(int i = 0; i < countofvana; i++)
for(int i = 0; i < countofnvana; i++)
for(int i = 0; i < countofbase; i++)
return 0;
}int cmp(const void * a, const void * b)
else if( (one->virtue + one->ability) < (two->virtue + two->ability) )
else
else if(one->virtue < two->virtue)
else
else
} }}
PAT 乙等 1004 C語言
讀入n名學生的姓名 學號 成績,分別輸出成績最高和成績最低學生的姓名和學號。輸入格式 每個測試輸入包含1個測試用例,格式為 第1行 正整數n 第2行 第1個學生的姓名 學號 成績 第3行 第2個學生的姓名 學號 成績 第n 1行 第n個學生的姓名 學號 成績其中姓名和學號均為不超過10個字元的字串,...
PAT 乙等 1011 C語言
給定區間 231,231 內的3個整數a b和c,請判斷a b是否大於c。輸入格式 輸入第1行給出正整數t 10 是測試用例的個數。隨後給出t組測試用例,每組佔一行,順序給出a b和c。整數間以空格分隔。輸出格式 對每組測試用例,在一行中輸出 case x true 如果a b c,否則輸出 cas...
PAT 乙等 1013 C語言
令pi表示第i個素數。現任給兩個正整數m n 104,請輸出pm到pn的所有素數。輸入格式 輸入在一行中給出m和n,其間以空格分隔。輸出格式 輸出從pm到pn的所有素數,每10個數字佔1行,其間以空格分隔,但行末不得有多餘空格。輸入樣例 5 27輸出樣例 11 13 17 19 23 29 31 3...