题目大意:
给出N个考生的准考证号、Virtue_Grade、Talent_Grade以及及格线L、优秀线H,然后对这n个考生进行分类:
1. 如果Virtue_Grade和Talent_Grade中有一一个低于L,则为不及格生,即为第5类,且设下面4类均及格。
2. 如果Virtue_Grade和Talent_Grade均不低于H,则为第1类。
3. 如果Virtue_Grade不低于H,Talent_Grade低于H,则为第2类。
4. 如果Virtue_Grade和Talent_Grade均低于H但Virtue_Grade不低于Talent_Grade,则为第3类。
算法思路:
题目没有什么难度,主要是细节得注意,在每一个考生在输入的时候直接判断属于哪一个梯队,对于低于L的考生直接不予考虑,这样保证参与排序的都是需要排序的考生。 排完序后直接按照要求输出即可。
排序规则:
先进行外部排序:
- Virtue_Grade和Talent_Grade大于等于H的称为圣人,排在第一梯队,内部根据总分非递增排序。
- Virtue_Grade大于等于H但是Talent_Grade低于H的君子,排在第二梯队,内部根据总分非递增排序。
- Virtue_Grade和Talent_Grade小于H但是Virtue_Grade大于等于Talent_Grade的称为愚人,排在第三梯队,内部根据总分非递增排序。
- 其余的Virtue_Grade和Talent_Grade大于等于L的称为小人,排在第四梯队,内部根据总分非递增排序。
然后进行内部排序:
首先按照总分非递减排序,总分相同的按照 Virtue_Grade和Talent_Grade有一个低于60分的不参与排序
提交结果:
第一次测试:
测试点2,3,4答案错误
第二次测试:
全部正确,原因在于第三梯队的Virtue_Grade大于等于Talent_Grade的等于没有添加导致出错。
AC代码:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct People{
int ID_Number;
int Virtue_Grade; // Virtue_Grade
int Talent_Grade; // Talent_Grade
int Total_Grade; // 总分
int level;// 梯队
};
vector<People> peoples;
bool cmp(People a,People b){
if (a.level!=b.level){
return a.level < b.level;
} else if (a.Total_Grade!=b.Total_Grade){
return a.Total_Grade > b.Total_Grade;
} else if (a.Virtue_Grade!=b.Virtue_Grade){
return a.Virtue_Grade > b.Virtue_Grade;
} else {
return a.ID_Number < b.ID_Number;
}
}
int main(){
int N,L,H;//人数,分数下限,分数上限
scanf("%d %d %d",&N,&L,&H);
People people;
for (int i = 0; i < N; ++i) {
scanf("%d %d %d",&people.ID_Number,&people.Virtue_Grade,&people.Talent_Grade);
if (people.Virtue_Grade>=L&&people.Talent_Grade>=L){
// Virtue_Grade和Talent_Grade都大于等于L的才进行排名
if (people.Virtue_Grade>=H&&people.Talent_Grade>=H){
// 圣人
people.level = 1;
} else if (people.Virtue_Grade>=H&&people.Talent_Grade<H){
// 君子
people.level = 2;
} else if (people.Virtue_Grade>=people.Talent_Grade){
// 愚人
people.level = 3;
} else{
// 小人
people.level = 4;
}
people.Total_Grade = people.Talent_Grade + people.Virtue_Grade;
peoples.push_back(people);
}
}
sort(peoples.begin(),peoples.end(),cmp);
printf("%d\n",peoples.size());
for (int k = 0; k < peoples.size(); ++k) {
printf("%d %d %d\n",peoples[k].ID_Number,peoples[k].Virtue_Grade,peoples[k].Talent_Grade);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。