1. 程式人生 > >ZZULIOJ 1197: 考試排名(一)(結構體專題)

ZZULIOJ 1197: 考試排名(一)(結構體專題)

題目描述今天浙大研究生複試的上機考試跟傳統筆試的打分規則相似,總共有n道題,每道題有對應分值,最後計算總成績。現給定錄取分數線,請你寫程式找出最後通過分數線的考生,並將他們的成績按降序列印。
輸入第1行給出考生人數N ( 1<= N<=100 )、考題數M (1<=M<=10 )、分數線(正整數)G;

第2行排序給出第1題至第M題的正整數分值;

以下N行,每行給出一名考生的准考證號(長度不超過20的字串)、該生解決的題目總數m、以及這m道題的題號

(題目號由1到M)。
輸出首先在第1行輸出不低於分數線的考生人數n,隨後n行按分數從高到低輸出上線考生的考號與分數,其間用1空格分隔。若有多名考生分數相同,則按他們考號的升序輸出。
樣例輸入4 5 25
10 10 12 13 15
CS004 3 5 1 3
CS003 5 2 4 1 3 5
CS002 2 1 2
CS001 3 2 3 5

樣例輸出3
CS003 60
CS001 37
CS004 37

#include<stdio.h>
#include<string.h>
#define swap(a,b,t){ t=a; a=b; b=t;}  
struct k{
 char a[30];
 int x;
 int sum;
};
int main(){
      int N,M,G,c;
      int i,j,f[20];
      scanf("%d%d%d",&N,&M,&G);
      for(i=0;i<M;i++)
      scanf("%d",&
f[i]); k b[100],t; for(i=0;i<N;i++) { b[i].sum=0; scanf("%s%d",b[i].a,&b[i].x); for(j=0;j<b[i].x;j++) { scanf("%d",&c); b[i].sum+=f[c-1]; } } for(int k=0;k<N;k++) for(j=0;j<N-1-k;j++){ if(b[j].sum<b[j+1].sum)
swap(b[j],b[j+1],t); if(b[j].sum==b[j+1].sum){ if(strcmp(b[j].a,b[j+1].a)>0) swap(b[j],b[j+1],t); } } int count=0; for(i=0;i<N;i++){ if(b[i].sum>=G) count++; else break; } printf("%d\n",count); for(i=0;i<N;i++){ if(b[i].sum<G)break; printf("%s %d\n",b[i].a,b[i].sum); } return 0; }