题目粗心:
给出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;}