题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312
注意:
当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
解法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n,l,h;
char f[9];
typedef struct{
char num[9];
int D;
int C;
}Peo;
Peo* p1;int n1=0;
Peo* p2;int n2=0;
Peo* p3;int n3=0;
Peo* p4;int n4=0;
void init()
{
p1=(Peo*)malloc(sizeof(Peo)*(n+1));
p2=(Peo*)malloc(sizeof(Peo)*(n+1));
p3=(Peo*)malloc(sizeof(Peo)*(n+1));
p4=(Peo*)malloc(sizeof(Peo)*(n+1));
return;
}
void add(int d,int c)
{
if(d>=h&&c>=h)
{
p1[n1].D=d;
p1[n1].C=c;
strcpy(p1[n1].num,f);
n1++;
}
else if(d>=h&&c<h)
{
p2[n2].D=d;
p2[n2].C=c;
strcpy(p2[n2].num,f);
n2++;
}
else if((d<h&&c<h)&&(d>=c))
{
p3[n3].D=d;
p3[n3].C=c;
strcpy(p3[n3].num,f);
n3++;
}
else
{
p4[n4].D=d;
p4[n4].C=c;
strcpy(p4[n4].num,f);
n4++;
}
}
int compare(const void* a,const void* b)
{
/*再把指针转换成指向结构体Peo类型的指针是还要在外面再加一层括号,
否则系统会有误解,以为我要把结构体成员变量转化成Peo*类型指针*/
int k=(((Peo*)a)->D+((Peo*)a)->C)-(((Peo*)b)->D+((Peo*)b)->C);
if(k!=0)return k;
else
{
int j=((Peo*)a)->D-((Peo*)b)->D;
if(j!=0)return j;
else
{
return (0-strcmp(((Peo*)a)->num,((Peo*)b)->num));
}
}
}
void Queue()
{
qsort(p1,n1,sizeof(Peo),compare);
qsort(p2,n2,sizeof(Peo),compare);
qsort(p3,n3,sizeof(Peo),compare);
qsort(p4,n4,sizeof(Peo),compare);
}
void output()
{
for(int i=(n1-1);i>=0;i--)printf("%s %d %d\n",p1[i].num,p1[i].D,p1[i].C);
for(int i=(n2-1);i>=0;i--)printf("%s %d %d\n",p2[i].num,p2[i].D,p2[i].C);
for(int i=(n3-1);i>=0;i--)printf("%s %d %d\n",p3[i].num,p3[i].D,p3[i].C);
for(int i=(n4-1);i>=0;i--)printf("%s %d %d\n",p4[i].num,p4[i].D,p4[i].C);
return;
}
int main()
{
int d,c;
scanf("%d%d%d",&n,&l,&h);
init();
int k=0;
for(int i=0;i<n;i++)
{
scanf("%s %d %d",f,&d,&c);
if(d<l||c<l)continue;
else
{
k++;
add(d,c);
}
for(int j=0;j<9;j++)f[j]='\0';
}
Queue();
printf("%d\n",k);
output();
free(p1);
free(p2);
free(p3);
free(p4);
return 0;
}