1. 程式人生 > >演算法筆記 — 排名

演算法筆記 — 排名

 

題目連結:http://codeup.cn/problem.php?cid=100000581&pid=8

題目描述

今天的上機考試雖然有實時的Ranklist,但上面的排名只是根據完成的題數排序,沒有考慮每題的分值,所以並不是最後的排名。給定錄取分數線,請你寫程式找出最後通過分數線的考生,並將他們的成績按降序列印。

輸入

測試輸入包含若干場考試的資訊。每場考試資訊的第1行給出考生人數N ( 0 < N < 1000 )、考題數M ( 0 < M < = 10 )、分數線(正整數)G;第2行排序給出第1題至第M題的正整數分值;以下N行,每行給出一名考生的准考證號(長度不超過20的字串)、該生解決的題目總數m、以及這m道題的題號(題目號由1到M)。 
當讀入的考生人數為0時,輸入結束,該場考試不予處理。

輸出

對每場考試,首先在第1行輸出不低於分數線的考生人數n,隨後n行按分數從高到低輸出上線考生的考號與分數,其間用1空格分隔。若有多名考生分數相同,則按他們考號的升序輸出。

樣例輸入

3 5 32
17 10 12 9 15
CS22003 5 1 2 3 4 5
CS22004 3 5 1 3
CS22002 2 1 5
0

樣例輸出

3
CS22003 63
CS22004 44
CS22002 32
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Stu{
	string sno;
	int score;
}stu[1111];
bool cmp(Stu x,Stu y){
	if(x.score!=y.score){
		return x.score>y.score;
	}else{
		return x.sno>y.sno; 
	}
}
int main(){
	int n,m,g;
	int sc[11];
	int num,x;
	while(cin>>n){
		if(n==0){
			break;
		}
		cin>>m>>g;
		for(int i=1;i<=m;i++){
			cin>>sc[i];
		} 
		int cnt=0;
		for(int i=1;i<=n;i++){
			cin>>stu[i].sno>>num;
			for(int j=1;j<=num;j++){
				cin>>x;
				stu[i].score+=sc[x];
			} 
			if(stu[i].score>=g){
				cnt++;
			}
		}
		sort(stu+1,stu+n+1,cmp);
		cout<<cnt<<endl;
		for(int i=1;i<=cnt;i++){
			cout<<stu[i].sno<<" "<<stu[i].score<<endl;
		}
		
	}
	return 0;
}