PAT---1015

来源:互联网 发布:淘宝vip课程免费下载 编辑:程序博客网 时间:2024/05/18 01:04

1015. 德才论 (25)

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Li

宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”

现给出一批考生的德才分数,请根据司马光的理论给出录取排名。

输入格式:

输入第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;}
这告诉了我们一个道理: 代码写的多并没有卵用,写的精才是牛人!



原创粉丝点击