考察知识点归纳:
1.对每组输入进行分类判断储存
2.对数组按要求排序
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int kaohao,cai,de;
}wxxpp;//设置学生结构体数组
int cmp(const void *p,const void *q){//根据条件按照条件优先级设置qsort()自定义函数
wxxpp *a=(wxxpp *)p,*b=(wxxpp *)q;
if(a->cai+a->de!=b->cai+b->de)//总分不同
return b->cai+b->de-a->cai-a->de;//直接用两值之差作返回值更方便
else if(a->cai+a->de==b->cai+b->de&&a->de!=b->de)//总分相同德分不同
return b->de-a->de;
else//都相同则准考证号
return a->kaohao-b->kaohao;
}
int main(void){
int i,t,N,L,H,x[4]={0};//设置x数组储存各类学生的人数(也便于循环排序与输出)
scanf("%d %d %d",&N,&L,&H);
wxxpp wxx[4][N],p;//由于学生分成四类,自然想到设置二维学生结构体数组(便于循环判断输出使代码更加简洁)
for(i=0;i<N;i++){
scanf("%d %d %d",&p.kaohao,&p.de,&p.cai);
if(p.de>=L&&p.cai>=L){//按题目要求讨论储存
if(p.de>=H&&p.cai>=H)
wxx[0][x[0]++]=p;//相同结构体变量间可直接赋值
else if(p.de>=H&&p.cai<H)
wxx[1][x[1]++]=p;
else if(p.de<H&&p.cai<H&&p.de>=p.cai)
wxx[2][x[2]++]=p;
else
wxx[3][x[3]++]=p;
}
}
printf("%d\n",x[0]+x[1]+x[2]+x[3]);//输出总的储存人数
for(i=0;i<4;i++){//下标正好对应第几类与该类的人数,故设置循环进行排序输出(也使代码更简洁)
qsort(wxx[i],x[i],sizeof(wxxpp),cmp);//不懂的可以查查qsort()快排函数的方法(防超时必备)
for(t=0;t<x[i];t++)
printf("%d %d %d\n",wxx[i][t].kaohao,wxx[i][t].de,wxx[i][t].cai);
}
return 0;
}