PAT乙级-1015 德才论-C语言实现(40行AC)

考察知识点归纳:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西西努力变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值