1015 德才论 (25 分)【详细解析版】

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值