2034. 比赛排名

单点时限: 2.0 sec

内存限制: 256 MB

小强参加了 ACM/ICPC 很久了,但是他开始做志愿者了,学校要他计算比赛排名,这个可难到喜欢偷懒的他了,所以他想找你帮忙,帮他计算比赛的排名。

具体排名规则如下:

比赛按照解题数量从多到少排名。

如果解答相同数量的队伍就按照所用时间从少到多排名,比赛时间的规则如下,对于每个队伍,他的解题时间都是他解答出的题目是时间累积起来的,比如他在 235 分钟解答出 1 个题目,且他通过这个题的前一共错了 N-1 次,在第 N 次通过,那么他的总时间将会加上 235+(N-1)×20,即错一次要罚时间 20 分钟。

如果解题数量和时间都相等,则按照他们的名字的字典序输出,数据保证没有名字相同的队伍。

输入格式
输入 2 个数 n 和 m,n(n<=1000) 表示队伍数量,m 表示这次比赛的题目总数,接下来 n 行数据,每次一个队伍名字接下来对他每个题的描述,首先一个时间 t,如果 t=0,表示他这个题没做出来,如果 t>0,则表示他在时间 t 时刻做出来了,接下来就有个数 k,表示他在第 k 次提交做出来这个题。

多 Case,处理到文件结束。

输出格式
对每个 case 输出 n 行,即按照上面规则排序后的队伍排名。具体看样例。

样例
input
5 5
xiaoqiang__000 144 16 0 0 0 199 12
xiaoqiang__001 0 48 1 244 3 0 102 11
xiaoqiang__002 16 4 0 81 4 157 18 40 15
xiaoqiang__003 102 19 90 7 0 0 241 5
xiaoqiang__004 0 57 20 158 15 97 5 0
output
rank = 1 , name = xiaoqiang__002 , solve = 4 , time = 1034
rank = 2 , name = xiaoqiang__001 , solve = 3 , time = 634
rank = 3 , name = xiaoqiang__003 , solve = 3 , time = 993
rank = 4 , name = xiaoqiang__004 , solve = 3 , time = 1052
rank = 5 , name = xiaoqiang__000 , solve = 2 , time = 863

/*
sort
*/
#include<iostream>
#include<algorithm>
using namespace std;
struct g {
	string name;
	int rank;
	int sovle=0;
	int time=0;
};
bool cmp(g a,g b) {
	if(a.sovle!=b.sovle)
		return a.sovle>b.sovle;
	else {
		if(a.time!=b.time)
			return a.time<b.time;
		return a.name<b.name;
	}
}
int main() {
	int n,m;
	while(cin>>n>>m) {
		g G[n];
		for(int i = 0; i < n; i++) {
			string name;
			cin>>name;
			G[i].name=name;
			G[i].sovle=m;
			for(int j = 0; j < m; j++) {
				int t;
				cin>>t;
				if(t==0)
					G[i].sovle--;
				else {
					int k;
					cin>>k;
					G[i].time+=t+(k-1)*20;
				}
			}
		}
		sort(G,G+n,cmp);
		for(int i = 0; i < n; i++) {
			printf("rank = %d , name = %s , solve = %d , time = %d\n",i+1,G[i].name.c_str(),G[i].sovle,G[i].time);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/105895507