宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”
现给出一批考生的德才分数,请根据司马光的理论给出录取排名。
输入第一行给出 3 个正整数,分别为:N(≤105),即考生总数;L(≥60),为录取最低分数线,即德分和才分均不低于 L 的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于 H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线 L 的考生也按总分排序,但排在第三类考生之后。
随后 N 行,每行给出一位考生的信息,包括:准考证号 德分 才分,其中准考证号为 8 位整数,德才分为区间 [0, 100] 内的整数。数字间以空格分隔。
输出第一行首先给出达到最低分数线的考生人数 M,随后 M 行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
起初,我采用的是方式一,提交后有两个测试点超时,没有满分。后来我怀疑是我输出的时候两层循环耗时,当我在结构体中加入等级变量,使ans数组变为一维数组之后,仍然超时。纳闷的我不得不求救度娘。不查不知道,一查吓一跳,原来是cin和cout的效率远低于scanf和printf。我也不探究原理了,直接将输入输出改为scanf和printf,果真AC!AC代码: #include <bits/stdc++.h> using namespace std; int N,L,H;//考生总数N<=100000,最低录取分数线L>=60, H为才德全尽 const int kind=4; //4类考生 struct student { int id; int moral; int talent; }a; bool cmp(student a,student b) { if(a.moral+a.talent==b.moral+b.talent) { if(a.moral==b.moral) return a.id<b.id; else return a.moral>b.moral; } else return a.moral+a.talent>b.moral+b.talent; } vector<student> ans[kind]; int main() { //第一类考生 cin>>N>>L>>H; int num=0; for(int i=0;i<N;i++) { scanf("%d %d %d",&a.id,&a.moral,&a.talent); //cin>>a.id>>a.moral>>a.talent; if(a.moral>=L&&a.talent>=L) { if(a.moral>=H&&a.talent>=H) //第一类 ans[0].push_back(a); else if(a.moral>=H&&a.talent<H) //第二类 ans[1].push_back(a); else if(a.moral<H&&a.talent<H&&a.talent<=a.moral) //第三类 ans[2].push_back(a); else ans[3].push_back(a); num++; } } cout<<num<<endl; for(int i=0;i<kind;i++) { sort(ans[i].begin(),ans[i].begin()+ans[i].size(),cmp); for(int j=0;j<ans[i].size();j++) //cout<<ans[i][j].id<<" "<<ans[i][j].moral<<" "<<ans[i][j].talent<<endl; printf("%d %d %d\n",ans[i][j].id,ans[i][j].moral,ans[i][j].talent); } return 0; }
看来以后在输入输出量大的时候要考虑用scanf和printf了。附贴方式2代码 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 5 int N,L,H;//考生总数N<=100000,最低录取分数线L>=60, H为才德全尽 6 const int kind=4; //4类考生 7 struct student 8 { 9 int id; 10 int moral; 11 int talent; 12 bool operator<(const student &b)const 13 { 14 if(moral+talent==b.moral+b.talent) 15 { 16 if(moral==b.moral) 17 return id>b.id; 18 else 19 return moral<b.moral; 20 } 21 else 22 return moral+talent<b.moral+b.talent; 23 } 24 }a; 25 26 27 priority_queue<student> ans[kind]; 28 int main() 29 { 30 31 //第一类考生 32 cin>>N>>L>>H; 33 int num=0; 34 35 for(int i=0;i<N;i++) 36 { 37 scanf("%d %d %d",&a.id,&a.moral,&a.talent); 38 //cin>>a.id>>a.moral>>a.talent; 39 if(a.moral>=L&&a.talent>=L) 40 { 41 if(a.moral>=H&&a.talent>=H) //第一类 42 ans[0].push(a); 43 else if(a.moral>=H&&a.talent<H) //第二类 44 ans[1].push(a); 45 else if(a.moral<H&&a.talent<H&&a.talent<=a.moral) //第三类 46 ans[2].push(a); 47 else 48 ans[3].push(a); 49 num++; 50 } 51 } 52 cout<<num<<endl; 53 for(int i=0;i<kind;i++) 54 { 55 while(!ans[i].empty()) 56 { 57 a=ans[i].top(); 58 ans[i].pop(); 59 printf("%d %d %d\n",a.id,a.moral,a.talent); 60 } 61 62 } 63 return 0; 64 }
将方式一优化为一位数组(结构体内增加class成员变量即可)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 5 int N,L,H;//考生总数N<=100000,最低录取分数线L>=60, H为才德全尽 6 const int kind=4; //4类考生 7 struct student 8 { 9 int id; 10 int clas; 11 int moral; 12 int talent; 13 }a; 14 15 bool cmp(student a,student b) 16 { 17 if(a.clas!=b.clas) 18 return a.clas<b.clas; 19 else 20 { 21 if(a.moral+a.talent==b.moral+b.talent) 22 { 23 if(a.moral==b.moral) 24 return a.id<b.id; 25 else 26 return a.moral>b.moral; 27 } 28 else 29 return a.moral+a.talent>b.moral+b.talent; 30 } 31 } 32 vector<student> ans; 33 int main() 34 { 35 36 //第一类考生 37 cin>>N>>L>>H; 38 int num=0; 39 40 for(int i=0;i<N;i++) 41 { 42 scanf("%d %d %d",&a.id,&a.moral,&a.talent); 43 //cin>>a.id>>a.moral>>a.talent; 44 if(a.moral>=L&&a.talent>=L) 45 { 46 if(a.moral>=H&&a.talent>=H) //第一类 47 { 48 a.clas=1;ans.push_back(a); 49 } 50 else if(a.moral>=H&&a.talent<H) //第二类 51 { 52 a.clas=2;ans.push_back(a); 53 } 54 else if(a.moral<H&&a.talent<H&&a.talent<=a.moral) //第三类 55 { 56 a.clas=3;ans.push_back(a); 57 } 58 else 59 { 60 a.clas=4;ans.push_back(a); 61 } 62 num++; 63 } 64 } 65 cout<<num<<endl; 66 67 sort(ans.begin(),ans.begin()+ans.size(),cmp); 68 for(int j=0;j<ans.size();j++) 69 //cout<<ans[j].id<<" "<<ans[j].moral<<" "<<ans[j].talent<<endl; 70 printf("%d %d %d\n",ans[j].id,ans[j].moral,ans[j].talent); 71 return 0; 72 }
转载于:https://www.cnblogs.com/ManOK/p/10176399.html
相关资源:JAVA上百实例源码以及开源项目