PAT B 1015德才论 C语言题解
题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312
题解:
只要读懂题目做起来就很简单的题,但是写起来很容易错,!写了两个小时,结果发现除了考生号是 升序,其他都是降序,原来是看错题了,哭。。
最优的做法估计是先分成四类,同一类存储到一起,最后对四个部分分别排序。但是比较难实现。
于是我是直接全排序做的。
为了避免超时,直接用stdlib.h库的qsort快排函数,自己实现比较函数comp, 注意若要降序排序,那么comp(a,b),a>b时应该返回负数,a==b时返回0,a<b时返回正数,升序反之。
#include <stdio.h>
#include <stdlib.h>
typedef struct Student {
int id; // 准考证号
int D; // 德
int C; // 才
int sum; // 总分
}Node;
int N,L,H;
int classify(int D,int C){
if(D >= H && C >= H)
return 1;
else if(D >= H)
return 2;
else if(D >= C)
return 3;
else
return 4;
}
int comp(const void *a,const void *b)
{
Node *x = (Node*)a;
Node *y = (Node*)b;
int cls1 = classify(x->D,x->C);
int cls2 = classify(y->D,y->C);
if(cls1 != cls2)
return cls1 - cls2;
else if(x->sum != y->sum)
return y->sum - x->sum;
else if(x->D != y->D)
return y->D - x->D;
else
return x->id - y->id;
}
void print(Node *arr,int M){
for(int i = 0;i < M; i++){
printf("%d %d %d",arr[i].id,arr[i].D,arr[i].C);
if(i!=M-1)
printf("\n");
}
}
int main(){
int M = 0;
scanf("%d %d %d",&N,&L,&H);
Node *arr = malloc(sizeof(struct Student) * (N));
for(int i=0;i<N;i++){
int id,D,C;
scanf("%d %d %d",&id,&D,&C);
if(D >= L && C >= L){ // 不及格的就不用读入数组了。
arr[M].id = id;
arr[M].D = D;
arr[M].C = C;
arr[M].sum = D+C;
M++;
}
}
qsort(arr,M,sizeof(struct Student),comp);
printf("%d\n",M);
print(arr,M);
return 0;
}
启示
注意审题! 注意审题!