题目地址:PAT1015.德才论(25)
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”
现给出一批考生的德才分数,请根据司马光的理论给出录取排名。
输入格式:
输入第1行给出3个正整数,分别为:N(<=105),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。
随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。
输出格式:
输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
超时Tips:
如果出现超时的情况,最简单的处理,大家可以试试把cin、cout改成scanf和printf
程序:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Stu
{
int sno;
int DMark;
int CMark;
int TotalMark;
};
bool compare(Stu stu1, Stu stu2)
{
if (stu1.TotalMark > stu2.TotalMark)
{
return true;
}
else if (stu1.TotalMark == stu2.TotalMark)
{
if (stu1.DMark > stu2.DMark)
{
return true;
}
else if (stu1.DMark == stu2.DMark)
{
return stu1.sno <= stu2.sno;
}
}
return false;
}
// printf速度比cout快,用上面这个方法会部分超时
void printStu(vector<Stu> stuMark){
for(vector<Stu>::iterator it = stuMark.begin() ; it != stuMark.end() ; it++ )
{
printf("%d %d %d\n", it->sno, it->DMark, it->CMark);
}
}
int main()
{
int N, L, H;
cin >> N >> L >> H;
vector <Stu> FriVector, SecVector, ThrVector, FouVector;
int count = 0;
for (int i = 0; i < N; ++i)
{
int sno, DMark, CMark;
cin >> sno >> DMark >> CMark;
if (DMark >= L && CMark >= L)
{
count ++;
Stu student;
student.sno = sno;
student.DMark = DMark;
student.CMark = CMark;
student.TotalMark = DMark + CMark;
if (DMark >= H && CMark >= H)
{
FriVector.push_back(student);
}
else if (DMark >= H && CMark < H)
{
SecVector.push_back(student);
}
else if (DMark < H && CMark < H && DMark >= CMark)
{
ThrVector.push_back(student);
}
else
{
FouVector.push_back(student);
}
}
}
sort(FriVector.begin(), FriVector.end(), compare);
sort(SecVector.begin(), SecVector.end(), compare);
sort(ThrVector.begin(), ThrVector.end(), compare);
sort(FouVector.begin(), FouVector.end(), compare);
cout << count << endl;
printStu(FriVector);
printStu(SecVector);
printStu(ThrVector);
printStu(FouVector);
return 0;
}
本文介绍PAT1015题目的解析,根据宋代史学家司马光的德才理论,对考生的德才分数进行排序,并提供了一种实现思路及代码示例。
1264

被折叠的 条评论
为什么被折叠?



