pat德才论
宋代史學(xué)家司馬光在《資治通鑒》中有一段著名的“德才論”:“是故才德全盡謂之圣人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術(shù),茍不得圣人,君子而與之,與其得小人,不若得愚人?!爆F(xiàn)給出一批考生的德才分?jǐn)?shù),請根據(jù)司馬光的理論給出錄取排名。
輸入描述:
輸入第1行給出3個(gè)正整數(shù),分別為:N(<=105),即考生總數(shù);L(>=60),為錄取最低分?jǐn)?shù)線,即德分和才分均不低于L的考生才有資格被考慮錄取;H(<100),為優(yōu)先錄取線——德分和才分均不低于此線的被定義為“才德全盡”,此類考生按德才總分從高到低排序;才分不到但德分到線的一類考生屬于“德勝才”,也按總分排序,但排在第一類考生之后;德才分均低于H,但是德分不低于才分的考生屬于“才德兼亡”但尚有“德勝才”者,按總分排序,但排在第二類考生之后;其他達(dá)到最低線L的考生也按總分排序,但排在第三類考生之后。隨后N行,每行給出一位考生的信息,包括:準(zhǔn)考證號、德分、才分,其中準(zhǔn)考證號為8位整數(shù),德才分為區(qū)間[0, 100]內(nèi)的整數(shù)。數(shù)字間以空格分隔。輸出描述:
輸出第1行首先給出達(dá)到最低分?jǐn)?shù)線的考生人數(shù)M,隨后M行,每行按照輸入格式輸出一位考生的信息,考生按輸入中說明的規(guī)則從高到低排序。當(dāng)某類考生中有多人總分相同時(shí),按其德分降序排列;若德分也并列,則按準(zhǔn)考證號的升序輸出。輸入例子:
14 60 8010000001 64 9010000002 90 6010000011 85 8010000003 85 8010000004 80 8510000005 82 7710000006 83 7610000007 90 7810000008 75 7910000009 59 9010000010 88 4510000012 80 10010000013 90 9910000014 66 60輸出例子:
1210000013 90 9910000012 80 10010000003 85 8010000011 85 8010000004 80 8510000007 90 7810000006 83 7610000005 82 7710000002 90 6010000014 66 6010000008 75 7910000001 64 90
思路:
首先通過讀題可以將排序分成四類排,由于我們并不知道每類大概有幾個(gè),所以使用數(shù)組存儲不合適,就用vector容器,將每類分好后,使用sort函數(shù)進(jìn)行排序,但要按照題目要求自己寫一個(gè)比較函數(shù)。
劃分思路:
c>=80,d>=80;
d>=80>c>=60;
80>d>=c>=60;
d>=60,c>=60;
#include<iostream> #include<vector> #include<algorithm> using namespace std; struct Test { ????int stdnum; ????int c; ????int d; ???// int flag; ????//int turn; }; bool Comp(Test a,Test b) { ????if((a.c+a.d)!=(b.c+b.d)) ????{ ????????return (a.c+a.d)>(b.c+b.d); ????????? ????} ????else ????{ ????????if(a.d!=b.d) ????????{ ????????????return a.d>b.d; ????????} ????????else ????????{ ????????????return a.stdnum<b.stdnum; ????????} ????} } int main() { ????int n,llimit,hlimit; ????cin>>n>>llimit>>hlimit; ????//test a[n]; ???// int count=0; ????//int point1,point2,point3,point4; ????vector<Test>v1,v2,v3,v4; ????Test test; ????int count=0; ????for(int i=0;i<n;i++) ????{ ????????cin>>test.stdnum; ????????cin>>test.d; ????????cin>>test.c; ????????? ????????if(test.c>=hlimit&&test.d>=hlimit) ????????{ ??????????v1.push_back(test); ????????????count++; ????????} ????????else if(test.d>=hlimit&&test.c<hlimit&&test.c>=llimit) ????????{ ????????????v2.push_back(test); ????????????count++; ????????} ?????????else if(test.d<hlimit&&test.d>=test.c&&test.c>=llimit) ????????{ ????????????v3.push_back(test); ????????????count++; ????????} ????????else if((test.d>=llimit)&&(test.c>=llimit)) ????????{ ????????????v4.push_back(test); ????????????count++; ????????} ????} ??sort(v1.begin(),v1.end(),Comp); ????sort(v2.begin(),v2.end(),Comp); ????sort(v3.begin(),v3.end(),Comp); ????sort(v4.begin(),v4.end(),Comp); ????cout<<count<<endl; ????vector<Test>::iterator it; ????for(it=v1.begin();it!=v1.end();it++) ????{ ????????cout<<it->stdnum<<" "<<it->d<<" "<<it->c<<endl; ????} ?????for(it=v2.begin();it!=v2.end();it++) ????{ ????????cout<<it->stdnum<<" "<<it->d<<" "<<it->c<<endl; ????} ?????for(it=v3.begin();it!=v3.end();it++) ????{ ????????cout<<it->stdnum<<" "<<it->d<<" "<<it->c<<endl; ????} ?????for(it=v4.begin();it!=v4.end();it++) ????{ ????????cout<<it->stdnum<<" "<<it->d<<" "<<it->c<<endl; ????} ????return 0; }總結(jié)
- 上一篇: 如何检测整数相加溢出
- 下一篇: 小程序爬坑