先把代码直接给出来,再听我慢慢讲解。
#include <bits/stdc++.h>
using namespace std;
struct stu{
char id[10];
int d;
int c;
int zong;
int lei;
};
struct stu a[100000];
bool cmp(stu a,stu b){
if(a.lei!=b.lei) return a.lei>b.lei;
else if(a.zong!=b.zong) return a.zong>b.zong;
else if(a.d!=b.d) return a.d>b.d;
else return strcmp(a.id,b.id)<0;
}
int main()
{
int n,sum=0,l,i,h;
scanf("%d%d%d",&n,&l,&h);
for(i=0;i<n;++i){
scanf("%s%d%d",a[i].id,&a[i].d,&a[i].c);
a[i].zong=a[i].c+a[i].d;
if(a[i].d>=l&&a[i].c>=l){
sum+=1;
if(a[i].d>=h&&a[i].c>=h) a[i].lei=5;//德才分都高于等于优先录取线
else if(a[i].d>=h&&a[i].c<h) a[i].lei=4;//德分到线H,才分不到
else if(a[i].d<h&&a[i].c<h&&a[i].d>=a[i].c) a[i].lei=3;
//德才分都不到线,但德分高于等于才分
else if(a[i].d>=l&&a[i].c>=l) a[i].lei=2;//德才分高于等于及格线
}
else a[i].lei=1;//不及格者
}
sort(a,a+n,cmp);
printf("%d\n",sum);
for(i=0;i<sum;++i){
printf("%s %d %d\n",a[i].id,a[i].d,a[i].c);
}
return 0;
}
题解之不读题了
这道题就是个排序问题,看的出来用结构体写,但关键在于明白题上说的分类是什么意思。所有学生可分为五类
才德全尽
德胜才
才德兼亡”但尚有“德胜才”者
过线生
不及格生
每一类具体的要求上面代码有 注意题上说的是不低于所以是>=。
现在就是个排序问题,统计及格人数,最后输出信息。
之后就是三个点去解决这道题。
sort函数之结构体排序
总所周知sort函数是十分好用的,当然也可以自己写,但不一定有它快和好。
sort函数如何将结构体排序,这就需要我们自己定义排序规则
这也是这道题的主要考察的点。
bool cmp(stu a,stu b){
if(a.lei!=b.lei) return a.lei>b.lei;
else if(a.zong!=b.zong) return a.zong>b.zong;
else if(a.d!=b.d) return a.d>b.d;
else return strcmp(a.id,b.id)<0;
}//根据题意写出规则 如第一条 先输出第一类学生。 才德全尽的人
//最后一条,全部条件相同时,按字典排序输出准考证号的升序排列
之后在所有信息输入后,进行一次排序就好了。
sort(a,a+n,cmp);
可能出现的超时问题
第一次写的时候全部的输入和输出全部是 cin cout,但在运行测试点3 和 4时,我的代码超时了。知道cin类比scanf要耗时,就改了一下,这道题就过了。题上的 N 学生人数<= 105,如此多的数据,cin 和scanf的差别就能体现出来了。
cin虽然写起来简单,但是先把要输出的东西存入缓冲区,再输出,导致效率降低。
scanf是格式化输入,printf是格式化输出,格式化输出效率比较高,但是写代码麻烦。
希望能对你有所帮助,
wish you all the best.