ACM大赛排名问题 之 竞赛排行榜

题目描述

HBMY第6届计算机程序设计竞赛(非专业组)正在火热进行,大家一定在不时的观望比赛的排行榜,看看自己的队伍排在哪个位置,现在Jarily告诉你这个排行榜是怎么得来的。
首先得说一下比赛规则,本次比赛共有10个题目,比赛时间为五个小时(0~300分钟),比赛期间,每队使用1台电脑需要在5个小时内使用C、C++或Java中的一种编写程序解决这10个问题。程序完成之后提交裁判机运行,会返回正确或错误两种结果。
最后的获胜者为正确解答题目最多且总用时最少的队伍。
每道试题的时间花费将从竞赛开始到试题提交并且被判定为正确为止,其间每一次提交运行结果被判错误的话将被加罚20分钟时间,未正确解答的试题不记时,如果已经返回正确的题目再重复提交则不影响结果。
例如:A、B两队都正确完成两道题目,其中A队提交这两题的时间分别是比赛开始后60分钟和165分钟,B队为80分钟和130分钟,但B队第一个题提交了2次才通过。这样A队的总用时为60+165=225而B队为(80+20)+130=230,所以A队以总用时少而获胜。
现在给出裁判机上面所有队伍的提交时间(分钟数)和返回结果,需要你编程输出当前比赛的排行榜。

输入

第一行输入为两个正整数N和M,N表示有N支队伍参赛,M表示裁判机上面一共有M次提交。
接下会输入M行,每一行为用空格隔开的字符串S1、两个整数A、B以及一个字符串S2,其中S1表示参赛队伍编号(team1到teamN), A表示提交时间(0到300),B表示提交的题目编号(1到10),S2表示返回结果,S2只可能为Yes或者No。
忽略秒的影响,即不会出现同一支队伍在同一分钟内提交同一个题目的情况。

输出

输出共有N行,输出一个简易的排行榜。即根据比赛规则将这N支队伍从第一名到第N名逐行输出,并且在每一行中输出他们的详细信息。
每一行中的输出内容和顺序为:队伍编号(team1到teamN),排名(1到N),解题数量(0到10),通过的题目花费的总时间,然后输出10个整数,代表十个题目的通过情况,如果该题没有通过则输出为-1,通过则输出其花费的时间且需要加上该题的加罚时间。每行的输出内容用空格隔开。
如果出现两支队伍解题数量和解题时间完全相同,则按照其队伍编号从小到大排列。

样例输入

6 10
team4 15 9 No
team4 16 9 No
team4 20 9 Yes
team4 26 4 Yes
team1 15 9 No
team3 15 10 No
team3 16 10 Yes
team1 30 3 Yes
team2 36 7 Yes
team6 35 2 No

样例输出

team4 1 2 86 -1 -1 -1 26 -1 -1 -1 -1 60 -1
team1 2 1 30 -1 -1 30 -1 -1 -1 -1 -1 -1 -1
team2 3 1 36 -1 -1 -1 -1 -1 -1 36 -1 -1 -1
team3 4 1 36 -1 -1 -1 -1 -1 -1 -1 -1 -1 36
team5 5 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
team6 6 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

分析:
注意scanf和cin输入的区别,cin输入时,不是以空格为分隔符的,而是模式匹配的,这里最好用scanf输入,用cin很容易导致运行错误!!!
team4 要用“team”和数字4 用两个string相加“team”+"4",就运行错误了 Yes和No,也不建议用string类型

AC代码如下:
#include "iostream"
#include "cstdlib"
#include "cstring"
#include "string"
#include "cstdio"
#include "algorithm"
#include "vector"
using namespace std;

struct Team
{
	int sum;				//队伍编号		
	int time;				//用时
	int num;				//AC题数
	vector  s;			//记录10道题的通过情况,通过则记录所用时间,未通过则为-1
	vector  count;		//标记10道题错误次数
}a[51];

bool cmp(Team a,Team b)		//排序规则
{
	if (a.num!=b.num)
	{
		return a.num>b.num;
	}
	else
	{
		if (a.time!=b.time)
		{
			return a.time>n>>m;
	//getchar();
	memset(a,0,sizeof(a));
	for (i=1;i<20;i++)//初始化各变量
	{
		a[i].sum=i;
		for (j=0;j<=20;j++)
		{
			a[i].s.push_back(-1);
			a[i].count.push_back(0);
		}
	}
	while(m--)
	{
		istime=0;
		scanf(" team%d%d%d%s",&num,&istime,&id,&is);//这个地方要特别注意,第一个空格过滤了换行,当然也可以用getchar();
		//getchar();
		//cin>>team1>>istime>>id>>is;//这样输入不行(其中team1是string类型,代表“teamN”,N=1,2,3,....n)
		//i=team1[4]-'0';			
		i=num;			//当前队伍编号
		if (is[0]=='Y')
		{
			if (a[i].s[id]==-1)//该题第一次AC
			{
				a[i].s[id]=istime+a[i].count[id]*20;
				a[i].time+=a[i].s[id];
				a[i].num++;
			}
		}
		else if(is[0]=='N')
		{
			if (a[i].s[id]==-1)//该题还没有AC
			{
				a[i].count[id]++;
			}
		}
	}
	sort(a+1,a+n+1,cmp);
	for (i=1;i<=n;i++)
	{
		cout<<"team"<


你可能感兴趣的:(sort排序(结构体排序,等))