1015 德才论 (25分) C语言

题目链接:

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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值