PAT Basic 1015德才论 C语言题解

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;
}

启示

注意审题! 注意审题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值