PAT解题1015

来源:互联网 发布:申通快递软件下载 编辑:程序博客网 时间:2024/05/08 16:45

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 79

10000001 64 90

解答:

本题最初想法是用结构体储存信息,然后对于不同种类的学生分别排序,最后分别输出。

调试后发现时长过长,应该是排序算法的问题。

在网上找到了代码,发现比自己写的要简单很多。

同时解析一下sort()库函数。

知识点1:vector

vector是c++提供的一种数据结构,也就是一个类,动态数组。

要有头文件<vector>

主要方法如下:

1.push_back 在数组的最后添加一个数据2.pop_back 去掉数组的最后一个数据 3.at 得到编号位置的数据4.begin 得到数组头的指针5.end 得到数组的最后一个单元+1的指针6.front 得到数组头的引用7.back 得到数组的最后一个单元的引用8.max_size 得到vector最大可以是多大9.capacity 当前vector分配的大小10.size 当前使用数据的大小11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值12.reserve 改变当前vecotr所分配空间的大小13.erase 删除指针指向的数据项14.clear 清空当前的vector15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)17.empty 判断vector是否为空18.swap 与另一个vector交换数据

3.2 详细的函数实现功能:其中vector<int> c.

c.clear() 移除容器中所有数据。

c.empty() 判断容器是否为空。

c.erase(pos) 删除pos位置的数据

c.erase(beg,end) 删除[beg,end)区间的数据

c.front() 传回第一个数据。

c.insert(pos,elem) 在pos位置插入一个elem拷贝

c.pop_back() 删除最后一个数据。

c.push_back(elem) 在尾部加入一个数据。

c.resize(num) 重新设置该容器的大小

c.size() 回容器中实际数据的个数。

c.begin() 返回指向容器第一个元素的迭代器

c.end() 返回指向容器最后一个元素的迭代器

声明迭代器:vector<student>::iterator itr;  

知识点2 sort()函数

使用时要<algorithm>头文件

sort(起始指针,结束指针)默认升序排列

如果要降序,调用sort(begin,end,compare);

其中compare为你自己写的函数;

  1. #include<vector>  
  2. #include<cstdio>  
  3. #include<algorithm>  
  4. using namespace std;  
  5.   
  6. struct student  //结构体
  7. {  
  8.     int kaohao;  
  9.     int defen;  
  10.     int caifen;  
  11.     int zongfen;  
  12. };  
  13.   
  14. bool compare(student a,student b) //比较a在b前则返回true,表示a在b前面  
  15. {  
  16.     if(a.zongfen>b.zongfen)  
  17.         return true;  
  18.     else if(a.zongfen == b.zongfen)  
  19.     {  
  20.         if(a.defen>b.defen)  
  21.             return true;  
  22.         else if(a.defen==b.defen)  
  23.         {  
  24.             if(a.kaohao<b.kaohao)  
  25.                 return true;  
  26.         }  
  27.     }  
  28.     return false;  
  29. }  
  30.   
  31. int main()  
  32. {  
  33.     vector<student> v1,v2,v3,v4;//表示四类考生  
  34.     student stu;//学生信息临时保存  
  35.     int count=0;//达标的学生总数  
  36.     int N,L,H;  
  37.   
  38.     //cin>>N>>L>>H;  
  39.     scanf("%d %d %d",&N,&L,&H);    
  40.     int K,D,C;  
  41.     while(N--)  
  42.     {  
  43.         //cin>>K>>D>>C;  
  44.         scanf("%d%d%d",&K,&D,&C);    
  45.         stu.kaohao = K;  
  46.         stu.defen = D;  
  47.         stu.caifen = C;  
  48.         stu.zongfen = D+C;  
  49.         if(D>=L && C>=L)  
  50.         {  
  51.             count++;  
  52.             if(D>=H && C>=H)  
  53.                 v1.push_back(stu);    
  54.             else if(D>=H && C<H )  
  55.                 v2.push_back(stu);  
  56.             else if(D<H && C<H  && D>=C)  
  57.                 v3.push_back(stu);  
  58.             else   
  59.                 v4.push_back(stu);  
  60.         }  
  61.       
  62.     }  
  63.     printf("%d\n",count);  
  64.     sort(v1.begin(),v1.end(),compare);  
  65.     sort(v2.begin(),v2.end(),compare);  
  66.     sort(v3.begin(),v3.end(),compare);  
  67.     sort(v4.begin(),v4.end(),compare);  
  68.   
  69.     vector<student>::iterator itr;  
  70.     for(itr=v1.begin();itr!=v1.end();itr++)  
  71.         printf("%d %d %d\n",itr->kaohao,itr->defen,itr->caifen);  
  72.     for(itr=v2.begin();itr!=v2.end();itr++)  
  73.         printf("%d %d %d\n",itr->kaohao,itr->defen,itr->caifen);  
  74.     for(itr=v3.begin();itr!=v3.end();itr++)  
  75.         printf("%d %d %d\n",itr->kaohao,itr->defen,itr->caifen);  
  76.     for(itr=v4.begin();itr!=v4.end();itr++)  
  77.         printf("%d %d %d\n",itr->kaohao,itr->defen,itr->caifen);  
  78.   
  79.     system("pause");  
  80.     return 0;  
  81. }  

0 0