Problem Description 今天的上機考試雖然有實時的Ranklist,但上面的排名只是根據完成的題數排序,沒有考慮 每題的分值,所以並不是最後的排名。給定錄取分數線,請你寫程序找出最後通過分數線的 考生,並將他們的成績按降序打印。 Input 測試輸入包含若干場考試的信息。每場考試信息的第1行給出考生人數N ( 0 < N < 1000 )、考題數M ( 0 < M < = 10 )、分數線(正整數)G;第2行排序給出第1題至第M題的正整數分值;以下N行,每行給出一 名考生的准考證號(長度不超過20的字符串)、該生解決的題目總數m、以及這m道題的題號 (題目號由1到M)。 當讀入的考生人數為0時,輸入結束,該場考試不予處理。 Output 對每場考試,首先在第1行輸出不低於分數線的考生人數n,隨後n行按分數從高 到低輸出上線考生的考號與分數,其間用1空格分隔。若有多名考生分數相同,則按他們考 號的升序輸出。 Sample Input 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 1 2 40 10 30 CS001 1 2 2 3 20 10 10 10 CS000000000000000001 0 CS000000000000000002 2 1 2 0 Sample Output 3 CS003 60 CS001 37 CS004 37 0 1 CS000000000000000002 20 Hint Huge input, scanf is recommended. [cpp] #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 1005 int que[15]; struct node { char name[25]; int num; int sum; } stu[N]; bool cmp(const node &a,const node &b) { if(a.sum == b.sum) return strcmp(a.name,b.name) < 0 ? 1 : 0; else return a.sum > b.sum; } int main() { int stu_num,text_num,line,a,cnt; while(scanf("%d",&stu_num)!=EOF && stu_num) { cnt = 0; int i; scanf("%d%d",&text_num,&line); for(i = 1; i<=text_num; i++) scanf("%d",&que[i]); for(i = 1; i<=stu_num; i++) { stu[i].sum = 0; scanf("%s%d",stu[i].name,&stu[i].num); while(stu[i].num--) { scanf("%d",&a); stu[i].sum+=que[a]; } if(stu[i].sum>=line) cnt++; } sort(stu+1,stu+1+stu_num,cmp); cout << cnt << endl; for(i = 1; i<=stu_num; i++) { if(stu[i].sum >=line) printf("%s %d\n",stu[i].name,stu[i].sum); else break; } } return 0; }