1. 程式人生 > >杭電 ACM Chapter One

杭電 ACM Chapter One

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