1. 程式人生 > >1015 德才論 (25 分)

1015 德才論 (25 分)

宋代史學家司馬光在《資治通鑑》中有一段著名的“德才論”:“是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。”

現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。

輸入格式:
輸入第一行給出 3 個正整數,分別為:N(≤10
​5
​​ ),即考生總數;L(≥60),為錄取最低分數線,即德分和才分均不低於 L 的考生才有資格被考慮錄取;H(<100),為優先錄取線——德分和才分均不低於此線的被定義為“才德全盡”,此類考生按德才總分從高到低排序;才分不到但德分到線的一類考生屬於“德勝才”,也按總分排序,但排在第一類考生之後;德才分均低於 H,但是德分不低於才分的考生屬於“才德兼亡”但尚有“德勝才”者,按總分排序,但排在第二類考生之後;其他達到最低線 L 的考生也按總分排序,但排在第三類考生之後。

隨後 N 行,每行給出一位考生的資訊,包括:准考證號 德分 才分,其中准考證號為 8 位整數,德才分為區間 [0, 100] 內的整數。數字間以空格分隔。

輸出格式:
輸出第一行首先給出達到最低分數線的考生人數 M,隨後 M 行,每行按照輸入格式輸出一位考生的資訊,考生按輸入中說明的規則從高到低排序。當某類考生中有多人總分相同時,按其德分降序排列;若德分也並列,則按准考證號的升序輸出。

其實就是一個結構體排序的問題,我個人認為要掌握結構體排序;

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b);
struct date
{
int sum,d,c,id;
}q[100000],w[100000],e[100000],r[100000];
int main()
{
int n,l,h,dd,cc,iidd,c1,c2,c3,c4;
c1=c2=c3=c4=0;
scanf("%d%d%d",&n,&l,&h);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&iidd,&dd,&cc);
if(dd>=l&&cc>=l)
{
if(dd>=h&&cc>=h)
{
q[c1].sum=dd+cc;
q[c1].d=dd;
q[c1].c=cc;
q[c1].id=iidd;
c1++;
}
else if(dd>=h&&cc<h)
{
w[c2].sum=dd+cc;
w[c2].d=dd;
w[c2].c=cc;
w[c2].id=iidd;
c2++;
}
else if(dd<h&&cc<h&&dd>=cc)
{
e[c3].sum=dd+cc;
e[c3].d=dd;
e[c3].c=cc;
e[c3].id=iidd;
c3++;
}
else
{
r[c4].sum=dd+cc;
r[c4].d=dd;
r[c4].c=cc;
r[c4].id=iidd;
c4++;
}
}
}
qsort(q,c1,sizeof(q[0]),cmp);
qsort(w,c2,sizeof(w[0]),cmp);
qsort(e,c3,sizeof(e[0]),cmp);
qsort(r,c4,sizeof(r[0]),cmp);
printf("%d",c1+c2+c3+c4);
for(int i=0;i<c1;i++)
{
printf("\n%d %d %d",q[i].id,q[i].d,q[i].c);
}
for(int i=0;i<c2;i++)
{
printf("\n%d %d %d",w[i].id,w[i].d,w[i].c);
}
for(int i=0;i<c3;i++)
{
printf("\n%d %d %d",e[i].id,e[i].d,e[i].c);
}
for(int i=0;i<c4;i++)
{
printf("\n%d %d %d",r[i].id,r[i].d,r[i].c);
}
return 0;
}
int cmp(const void *a,const void *b)
{
struct date *c=(date *)a;
struct date *e=(date *)b;
if(c->sum!=e->sum)
{
return e->sum-c->sum;
}
else
{
if(c->d!=e->d)
{
return e->d-c->d;
}
else
{
return c->id-e->id;
}
}
}

肯定有更好的寫法,但是以我目前的知識水平就這樣了吧。。。