2088 Problem I 排名

問題 I: 排名

時間限制: 1 Sec  內存限制: 32 MB

題目描述

今天的上機考試雖然有實時的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

經驗總結

不難~~計算好每個人的分數後按題目要求排序即可~

AC代碼

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct student
{
	char id[30];
	int test_num;
	int test_id[20];
	int sum;
}stu[1010];
bool cmp(student a,student b)
{
	if(a.sum==b.sum)
		return strcmp(a.id,b.id)<0;
	return a.sum>b.sum;
}
int main()
{
	int n,score[20],point,num,person=0;
	while(~scanf("%d",&n))
	{
		if(n==0) break;
		scanf("%d %d",&num,&point);
		for(int i=0;i<num;i++)
			scanf("%d",&score[i]);
		for(int i=0;i<n;i++)
		{
			stu[i].sum=0;
			scanf("%s %d",stu[i].id,&stu[i].test_num);
			for(int j=0;j<stu[i].test_num;j++)
			{
				scanf("%d",&stu[i].test_id[j]);
				stu[i].sum+=score[stu[i].test_id[j]-1];
			}
			if(stu[i].sum>=point)
				person++;
		}
		sort(stu,stu+n,cmp);
		printf("%d\n",person);
		for(int i=0;i<n;i++)
		{
			if(stu[i].sum>=point)
				printf("%s %d\n",stu[i].id,stu[i].sum);
			else break;
		}
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章