1.德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;
2.才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;
3.德才分均低于H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;
4.其他达到最低线 L的考生也按总分排序,但排在第三类考生之后。
5.当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
AC代码:
#include <stdio.h>
#include <stdlib.h> //使用qsort()函数
typedef struct inf{
int num;
int d;
int c;
int tag;
int sum;
}student;
int cmp(const void *a,const void *b){
student * pa=(student *)a;
student * pb=(student *)b;
if(pa->tag<pb->tag){
return -1; //tag值小的在前
}
else if(pa->tag==pb->tag&&pa->sum>pb->sum){
return -1; //总分大的在前
}
else if(pa->tag==pb->tag&&pa->sum==pb->sum&&pa->d>pb->d){
return -1; //德育分大的在前
}
else if(pa->tag==pb->tag&&pa->sum==pb->sum&&pa->d==pb->d&&pa->num<pb->num){
return -1; //学号小的在前
}
else
return 1;
}
int main(){
int n,l,h,unpass=0;
scanf("%d %d %d",&n,&l,&h);
student st[n],temp;
for(int i=0;i<n;i++){
scanf("%d %d %d",&st[i].num,&st[i].d,&st[i].c);
st[i].sum=st[i].d+st[i].c;
if(st[i].d>=h&&st[i].c>=h)
st[i].tag=1;
else if(st[i].d>=h&&st[i].c>=l)
st[i].tag=2;
else if(st[i].d>=l&&st[i].c>=l&&st[i].d>=st[i].c)
st[i].tag=3;
else if(st[i].d>=l&&st[i].c>=l){
st[i].tag=4;
}
else{
st[i].tag=5;
unpass++;
}
}
qsort(st,n,sizeof(student),cmp);
printf("%d\n",n-unpass);
for(int i=0;i<n-unpass;i++){
printf("%d %d %d\n",st[i].num,st[i].d,st[i].c);
}
return 0;
}
其中qsort()函数使用见->qsort()函数
超时代码:
#include <stdio.h>
struct inf{
int num;
int d;
int c;
int tag;
int sum;
};
int main(){
int n,l,h,unpass=0;
scanf("%d %d %d",&n,&l,&h);
struct inf st[n],temp;
for(int i=0;i<n;i++){
scanf("%d %d %d",&st[i].num,&st[i].d,&st[i].c);
st[i].sum=st[i].d+st[i].c;
if(st[i].d>=h&&st[i].c>=h)
st[i].tag=1;
else if(st[i].d>=h&&st[i].c>=l)
st[i].tag=2;
else if(st[i].d>=l&&st[i].c>=l&&st[i].d>=st[i].c)
st[i].tag=3;
else if(st[i].d>=l&&st[i].c>=l){
st[i].tag=4;
}
else{
st[i].tag=5;
unpass++;
}
}
for(int i=0;i<n-1;i++){
for(int j=n-1;j>i;j--){
if(st[j].tag<st[j-1].tag){
temp=st[j];
st[j]=st[j-1];
st[j-1]=temp;
}
else if(st[j].tag==st[j-1].tag&&st[j].sum>st[j-1].sum){
temp=st[j];
st[j]=st[j-1];
st[j-1]=temp;
}
else if(st[j].tag==st[j-1].tag&&st[j].sum==st[j-1].sum&&st[j].d>st[j-1].d){
temp=st[j];
st[j]=st[j-1];
st[j-1]=temp;
}
else if(st[j].tag==st[j-1].tag&&st[j].sum==st[j-1].sum&&st[j].d==st[j-1].d&&st[j].num<st[j-1].num){
temp=st[j];
st[j]=st[j-1];
st[j-1]=temp;
}
}
}
printf("%d\n",n-unpass);
for(int i=0;i<n-unpass;i++){
printf("%d %d %d\n",st[i].num,st[i].d,st[i].c);
}
return 0;
}