PAT---1015
来源:互联网 发布:淘宝vip课程免费下载 编辑:程序博客网 时间:2024/05/18 01:04
1015. 德才论 (25)
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”
现给出一批考生的德才分数,请根据司马光的理论给出录取排名。
输入格式:
输入第1行给出3个正整数,分别为:N(<=105),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。
随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。
输出格式:
输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
输入样例: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
解题思路:本人先是单纯用结构体做sort,swap,后来发生了段错误,估计是元素太多的原因,只能放弃,看了网上大牛们的代码,不得不叫我怀疑人生啊!先是在sort里面将输出顺序调整好(因为algorithm里面默认是降序),再利用vector存储结构体!再利用迭代器输出,算是帮我复习了一下C++的STL吧,收获挺大的,不得不向大佬看起啊!
#include <vector> //与结构体对应的迭代器啊啊啊!!!#include <stdio.h>#include <iostream>#include <algorithm>using namespace std;struct Student{ int id; int EQ; int IQ; bool operator < (const Student &sd)const;};//sort里面默认是降序排列,故需要改变排序方式bool Student::operator<(const Student &sd)const{ if(EQ + IQ != sd.EQ + sd.IQ) return EQ + IQ > sd.EQ + sd.IQ; else if(EQ != sd.EQ) return EQ > sd.EQ; else return id < sd.id;}int main(void){ int i, count = 0; int N, L, H; vector<Student> vec1, vec2, vec3, vec4; //结构体可以放入容器啊啊啊!!! cin>>N>>L>>H; Student sd; for(i = 0; i < N; i++){ cin>>sd.id>>sd.EQ>>sd.IQ; if(sd.EQ >= L && sd.IQ >= L){ count++; if(sd.EQ >= H && sd.IQ >= H) vec1.push_back(sd); //这里只有一个结构体,只需要放入即可 else if(sd.EQ >= H && sd.IQ < H) vec2.push_back(sd); else if(sd.EQ < H && sd.IQ < H && sd.EQ >= sd.IQ) vec3.push_back(sd); else vec4.push_back(sd); } } //然后TMD就这么排好序了啊啊!!!! sort(vec1.begin(), vec1.end()); sort(vec2.begin(), vec2.end()); sort(vec3.begin(), vec3.end()); sort(vec4.begin(), vec4.end()); vector<Student>::iterator itr; cout<<count<<endl; for(itr = vec1.begin(); itr != vec1.end(); itr++) printf("%d %d %d\n", itr->id, itr->EQ, itr->IQ); for(itr = vec2.begin(); itr != vec2.end(); itr++) printf("%d %d %d\n", itr->id, itr->EQ, itr->IQ); for(itr = vec3.begin(); itr != vec3.end(); itr++) printf("%d %d %d\n", itr->id, itr->EQ, itr->IQ); for(itr = vec4.begin(); itr != vec4.end(); itr++) printf("%d %d %d\n", itr->id, itr->EQ, itr->IQ); return 0;}
注:这里说明一下,printf运行时间比cout短,所以在后面的时候用cout会出现运行超时的情况,读者可以自行检查。
总结:我单一用结构体,比较了很多东西,居然忘记了结构体是可以直接在sort里面排序的,另外,按照某些条件TMD居然也可以,这一定要用小本本记下来,最后,结构体可以放入vector中也要记下来,总之,太感慨了,C++的知识记起来了一点点,还有就是重载< 运算符,这里我还是想说这居然可以在sort里面用,我TM也是服!!!,还有就是输入一个结构体就可以在vector中存储下来,这也算是整数和数组的关系吧,排好序以后就可以输出了。
附上operator的参考地址: http://www.cnblogs.com/xiangxiaodong/archive/2012/02/12/2348144.html
附上我之前写的代码,对于很大数不满足,会出现栈溢出的现象,尬住了
#include <cstring>#include <iostream>#include <algorithm>#include <stdlib.h>using namespace std;struct Student{ char id[15]; int EQ; int IQ; int Score;};bool cmp(const Student a, const Student b){ return a.Score > b.Score;}int main(void){ int i = 0, j1 = 0, j2 = 0, j3 = 0, j4 = 0, count = 0; int N, L, H; cin>>N>>L>>H; Student student[N + 1], student1[N + 1], student2[N + 1], student3[N + 1], student4[N + 1]; //哇,第一次自己用结构体啊! //将学生分成4类 while(i < N){ cin>>student[count].id>>student[count].EQ>>student[count].IQ; //输入N个student,但实际只保留及格的人 if(student[count].EQ < L || student[count].IQ < L) i++; else{ if(student[count].EQ >= H && student[count].IQ >= H){ //第一类学生 strcpy(student1[j1].id, student[count].id); student1[j1].EQ = student[count].EQ; student1[j1].IQ = student[count].IQ; student1[j1].Score = student1[j1].EQ + student1[j1].IQ; j1++; } else if(student[count].EQ >= H && student[count].IQ < H){ //第二类学生 strcpy(student2[j2].id, student[count].id); student2[j2].EQ = student[count].EQ; student2[j2].IQ = student[count].IQ; student2[j2].Score = student2[j2].EQ + student2[j2].IQ; j2++; } else if(student[count].EQ < H && student[count].IQ < H && student[count].EQ >= student[count].IQ){ //第三类学生 strcpy(student3[j3].id, student[count].id); student3[j3].EQ = student[count].EQ; student3[j3].IQ = student[count].IQ; student3[j3].Score = student3[j3].EQ + student3[j3].IQ; j3++; } else{ //第四类学生 strcpy(student4[j4].id, student[count].id); student4[j4].EQ = student[count].EQ; student4[j4].IQ = student[count].IQ; student4[j4].Score = student4[j4].EQ + student4[j4].IQ; j4++; } count++; i++; } } cout<<count<<endl; sort(student1, student1 + j1, cmp); sort(student2, student2 + j2, cmp); sort(student3, student3 + j3, cmp); sort(student4, student4 + j4, cmp); for(i = 0; i < j1 - 1; i++) if(student1[i].Score == student1[i + 1].Score) if(student1[i].EQ < student1[i + 1].EQ) swap(student1[i], student1[i + 1]); else if(student1[i].EQ == student1[i + 1].EQ) if(strtol(student1[i].id, NULL, 10) - strtol(student1[i + 1].id, NULL, 10) > 0) swap(student1[i], student1[i + 1]); else ; for(i = 0; i < j2 - 1; i++) if(student2[i].Score == student2[i + 1].Score) if(student2[i].EQ < student2[i + 1].EQ) swap(student2[i], student2[i + 1]); else if(student2[i].EQ == student2[i + 1].EQ) if(strtol(student2[i].id, NULL, 10) - strtol(student2[i + 1].id, NULL, 10) > 0) swap(student2[i], student2[i + 1]); else ; for(i = 0; i < j3 - 1; i++) if(student3[i].Score == student3[i + 1].Score) if(student3[i].EQ < student3[i + 1].EQ) swap(student3[i], student3[i + 1]); else if(student3[i].EQ == student3[i + 1].EQ) if(strtol(student3[i].id, NULL, 10) - strtol(student3[i + 1].id, NULL, 10) > 0) swap(student3[i], student3[i + 1]); else ; for(i = 0; i < j4 - 1; i++) if(student4[i].Score == student4[i + 1].Score) if(student4[i].EQ < student4[i + 1].EQ) swap(student4[i], student4[i + 1]); else if(student4[i].EQ == student4[i + 1].EQ) if(strtol(student4[i].id, NULL, 10) - strtol(student4[i + 1].id, NULL, 10) > 0) swap(student4[i], student4[i + 1]); else ; for(i = 0; i < j1; i++) cout<<student1[i].id<<" "<<student1[i].EQ<<" "<<student1[i].IQ<<endl; for(i = 0; i < j2; i++) cout<<student2[i].id<<" "<<student2[i].EQ<<" "<<student2[i].IQ<<endl; for(i = 0; i < j3; i++) cout<<student3[i].id<<" "<<student3[i].EQ<<" "<<student3[i].IQ<<endl; for(i = 0; i < j4; i++) cout<<student4[i].id<<" "<<student4[i].EQ<<" "<<student4[i].IQ<<endl; return 0;}这告诉了我们一个道理: 代码写的多并没有卵用,写的精才是牛人!
- pat--1015
- PAT-1015
- pat 1015
- pat 1015
- PAT 1015
- pat 1015
- PAT 1015
- PAT---1015
- PAT 1015 Reversible Primes
- PAT (Basic) 1011~1015
- PAT(A) 1015
- pat 1015 Reversible Primes
- zju pat 1015
- PAT Advanced 1015
- PAT(甲级)1015
- PAT 1015德才论
- PAT解题1015
- PAT 1015 德才论
- html表单
- 58.Oracle杂记——Oracle诊断常用命令
- 【转】Java 内存区域和GC机制
- 134. Gas Station
- hdu 3567 康托展开 +BFS
- PAT---1015
- 深度学习之卷积
- 主席树详解
- commons-io功能汇总
- 判断奇数和偶数
- TextView误用"inputType"属性会导致点击事件失效!
- 洛谷 1600 [NOIP2016] 天天爱跑步 树链剖分+桶 (暴力+正解)
- 2.1.3 程序的方式开发界面
- mysql最新版explain详解来自官网直译(1)