欢迎访问PAT乙级题解总目录:https://blog.csdn.net/qq_26139541/article/details/108742687
1015德才论(25)
题目入口1015德才论(25)
题解思路:因为分为4类考生,3类考生一定排在4类考生前面,不管分数如何,有一种情况,如果有考生才分很高超过了H, 但是德分低于H,他是一个第4类的考生,但是总分可能比前几类考生高,
所以可以在结构体里加上考生的优先级rankk,这样通过自定义排序可以省去很多麻烦。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<time.h>
#include<vector>
using namespace std;
int n,l,h;
struct student
{
int num; //考号
int mind; //德分
int talent; //才分
int rankk; //优先级
}stu[100005];
bool cmp(student a,student b)
{
int f1 = a.mind+a.talent;
int f2 = b.mind+b.talent;
if(a.rankk!=b.rankk)
return a.rankk < b.rankk; //如果优先级不同,按优先级排序
else if(f1!=f2) //如果总分不同,优先级相同,按总分排序
return f1 > f2;
else if(a.mind!=b.mind)
return a.mind > b.mind; //如果优先级和总分都相等,按德分排
else
return a.num < b.num;
}
int main()
{
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
cin>>n>>l>>h;
int NUM,MIND,TALENT;
int k = 0;
for(int i=0; i<n; ++i){
cin>>NUM>>MIND>>TALENT;
if(MIND<l||TALENT<l)
continue;
stu[k].num = NUM;
stu[k].mind = MIND;
stu[k].talent = TALENT;
if(stu[k].mind>=h&&stu[k].talent>=h){
stu[k].rankk = 1;
}
else if(stu[k].mind>=h&&stu[k].talent<h){
stu[k].rankk = 2;
}
else if(stu[k].mind<h&&stu[k].talent<h&&stu[k].mind>=stu[k].talent){
stu[k].rankk = 3;
}
else stu[k].rankk = 4;
k++;
}
sort(stu,stu+k,cmp);
cout<<k<<endl;
for(int i=0; i<k; ++i){
cout<<stu[i].num<<' '<<stu[i].mind<<' '<<stu[i].talent<<endl;
}
return 0;
}