PTA 1015 德才论 (题解+知识点)c++

先把代码直接给出来,再听我慢慢讲解。

#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.

Guess you like

Origin blog.csdn.net/M1170780140/article/details/104036527