杭電 ACM Chapter One
阿新 • • 發佈:2018-11-22
Section Three
排名
- 認真讀題,發現現實按成績降序,再按學號升序
程式碼
#include <stdio.h>
#include <string.h>
typedef struct tagData{
char Sno[25];//學號
int a;//解題總數
int B[10];//解決題目的編號
int sum;//學生總分
}Info;
void InsertSort(Info *A,int N)
{
int k,s;
Info t,r;
for(int i=1;i<N;i++)
{
t=A[i];
k=i-1 ;
while(t.sum>A[k].sum)
{
A[k+1]=A[k];
k--;
if(k==-1) break;
}
A[k+1]=t;
s=k+1;
while(s)
{
if(A[s].sum==A[s-1].sum)
{
if(strcmp(A[s].Sno,A[s-1].Sno)<0)
{
r=A[s-1 ];
A[s-1]=A[s];
A[s]=r;
}
s--;
}
else break;
}
}
}
int main()
{
int N;//考生人數
int M,G;//M考題數,G分數線
int score[20];//每道題的分數
Info Data[1000],person[1000];
int SN;//超過分數線的學生
while(scanf("%d" ,&N)!=EOF && N!=0)
{
SN=0;
scanf("%d%d",&M,&G);
for(int i=0;i<M;i++) scanf("%d",&score[i]);
for(int i=0;i<N;i++)
{
Data[i].sum=0;
scanf("\n%s %d",Data[i].Sno,&Data[i].a);
for(int j=0;j<Data[i].a;j++)
{
scanf("%d",&Data[i].B[j]);
Data[i].sum += score[Data[i].B[j]-1];
}
if(G<=Data[i].sum)
{
person[SN]=Data[i];
SN++;
}
}
printf("%d\n",SN);
InsertSort(person,SN);
for(int i=0;i<SN;i++)
printf("%s %d\n",person[i].Sno,person[i].sum);
}
return 0;
}