大致思路:对于读入的数据,进行学生分类并存储在结构体中,然后进行多标尺的排序,第一标尺是学生类别,第二标尺是学生的总成绩,第三标尺是学生的道德成绩,最后是学号的字典序
本题的关键是结构体的设计和cmp函数的编写,结构体中用flag标志进行学生类别的区分
属于典型的排序题
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
#define maxn 1000
using namespace std;
struct stu
{
int d;
int c;
string num;
stu(int d,int c,string t):d(d),c(c),num(t){}
int flag;
};
vector<stu>s;
bool cmp(stu a,stu b)
{
if(a.flag!=b.flag){
return a.flag<b.flag;
}
if(a.c+a.d!=b.c+b.d){
return a.c+a.d>b.c+b.d;
}
if(a.d!=b.d){
return a.d>b.d;
}
return a.num<b.num;
}
int n;
int main()
{
scanf("%d",&n);
int up,low;
scanf("%d %d",&low,&up);
while(n--){
string temp;
int d,c;
cin>>temp;
scanf("%d %d",&d,&c);
stu t(d,c,temp);
if(d>=up&&c>=up){
t.flag=1;
}
else if(d>=up&&c<up){
t.flag=2;
}
else if(d>=c){
t.flag=3;
}
else{
t.flag=4;
}
if(d<low||c<low){
continue;
}
s.push_back(t);
}
sort(s.begin(),s.end(),cmp);
printf("%d\n",s.size());
for(stu x:s){
cout<<x.num;
printf(" %d %d\n",x.d,x.c);
}
return 0;
}