列表

详情


NC54668. 排序

描述

大学生程序设计竞赛是一项参赛选手在有限时间内编写程序解决问题的竞赛,一场比赛通常有 8~13 个问题。 比赛开始后,选手们可以针对问题编写程序并提交解答代码,评测系统实时对参赛选手的提交进行评测,可能的评测结果有:Accepted、Wrong-Answer、Time-Limit-Exceeded、Memory-Limit-Exceeded、Presentation-Error、Runtime-Error、Compilation-Error、Output-Limit-Exceeded。
排名系统根据参赛队伍的解决问题数量以及总用时来确定排名。
比赛的具体规则如下:
1. 参赛队伍按解题数量,由高到低排名(解题多的排名靠前)。解题数相同的,按总用时(以分钟为最小单位)由低到高排名(总用时少的排名靠前)。解题数与总用时均相同的队伍则并列排名。
2. 如果一个队伍在比赛第 x 分钟对一个还未解决的罚时为 y 的题目提交了解答代码,并被评测系统评判为 Accepted ,那么该队伍的解题数量加 1,总用时加上 x+y 。
3. 如果一个队伍对一个已经解决了的问题提交了解答代码,那么无论评测结果如何,此次提交都不产生任何影响。
4. 如果一个队伍对比赛第 x 分钟对一个还未解决的题目提交了解答代码,并被评测系统评判为 Compilation-Error,那么此次提交不产生任何影响。
5. 如果一个队伍在比赛第 x 分钟对一个还未解决的题目提交了解答代码,并被评测系统评判为其他结果,那么该队伍在该问题上的罚时加上 20。
未解决题目的罚时不计入总用时,初始时刻每个队伍在所有题目上的罚时均为 0 。
现在给出参赛队伍名单,以及评测系统按时序给出的评测结果,请你输出最后的榜单。

输入描述

第一行包括一个整数 T(1<=T<=100) ,表示数据组数。
对于每一组数据:
第一行包括两个整数 n,m(1<=n<=13, 1<=m<=50) ,表示题目数与参赛队伍数。
接下来 m 行给出所有的参赛队伍名称,每行包括一个长度不超过 20 的字符串,表示一个参赛队伍的名称。
接下来一行包括一个整数 q(1<=q<=2000) ,表示评测信息数。
接下来 q 行按时序给出评测信息,每行包括一条评测信息,格式为:提交队伍名 提交时间(距离比赛开始过了的分钟数) 提交题号 评测结果

输出描述

对于每组数据,输出 m 行,表示排序后每个队伍的信息,格式为:
队伍排名 队伍名 队伍解题数 队伍总用时 A题解答情况 B题解答情况 C题解答情况 ...
其中解答情况的表示方式为:若该队伍未解决该题,则表示为 -x ,x 是该队伍在该问题上的提交次数;若该队伍解决了该题,则表示为 +x(y),x 是该队伍在该问题上的提交次数(不包括已经通过该题后的提交),y 是该队伍通过此题时的时间。
对于排名并列的队伍,按队伍名字典序由小到大进行输出。
在相邻数据之间输出一个空行(最后一组数据后不要输出空行)。

示例1

输入:

2
6 1
rzy_99
7
rzy_99 2 A Wrong-Answer
rzy_99 5 A Compilation-Error
rzy_99 10 A Accepted
rzy_99 21 B Accepted
rzy_99 42 C Accepted
rzy_99 51 D Accepted
rzy_99 72 F Time-Limit-Exceeded
2 3
rzy_01
rzy_99
rzy_00
2
rzy_01 5 A Accepted
rzy_00 5 B Accepted

输出:

1 rzy_99 4 144 +2(10) +1(21) +1(42) +1(51) -0 -1

1 rzy_00 1 5 -0 +1(5)
1 rzy_01 1 5 +1(5) -0
3 rzy_99 0 0 -0 -0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Ruby(2.4.2) 解法, 执行用时: 676ms, 内存消耗: 7928K, 提交时间: 2019-11-17 19:21:21

AC = "Accepted"
WA = "Wrong-Answer"
TLE = "Time-Limit-Exceeded"
MLE = "Memory-Limit-Exceeded"
PE = "Presentation-Error"
RE = "Runtime-Error"
CE = "Compilation-Error"
OLE = "Output-Limit-Exceeded"

# 	scr : Hash		题号 => [提交, 罚时, 通过时刻]
# 	arr : Array		出题, 罚时, 队名, scr
# 	set : Hash		队名 => arr

def cmp a, b
	return b[0] <=> a[0] if a[0] != b[0]
	return a[1] <=> b[1] if a[1] != b[1]
	return a[2] <=> b[2]
end

T = gets.to_i
T.times do |t|
	puts '' if t > 0
	# BEGIN
	N, M = gets.split.map(&:to_i)
	set = {}
	M.times do
		name = gets.chomp
		h = Hash.new
		prob = 'A'
		N.times do
			h[prob] = [0, nil, 0]
			prob.succ!
		end
		a = [0, 0, name, h]
		set[name] = a
	end
	
	Q = gets.to_i
	Q.times do
		name, time, prob, stat = gets.split
		# AC CE next
		next if set[name][3][prob][1]
		next if stat == CE
		
		#  ++submit 
		set[name][3][prob][0] += 1
		
		if stat == AC 
			#  ++AC
			tmp = set[name][3][prob][1] = time.to_i + set[name][3][prob][0] * 20 - 20
			set[name][3][prob][2] = time.to_i
			set[name][1] += tmp
			set[name][0] += 1
		end
	end
	
	standing = [[N + 1, 0, "Kai"]]
	set.each_value do |x|
		standing << x
	end
	standing.sort! { |x, y| cmp x, y }
	
	last = 0
	for i in 1..M
		tmp = []
		if standing[i][0] == standing[last][0] and
			standing[i][1] == standing[last][1]
			tmp << last
		else
			last = i
			tmp << last
		end
		
		tmp << standing[i][2]
		tmp << standing[i][0]
		tmp << standing[i][1]
		
		prob = 'A'
		N.times do
			str = ''
			if standing[i][3][prob][1]
				str = '+' + standing[i][3][prob][0].to_s + '(' + standing[i][3][prob][2].to_s + ')'
			else
				str = '-' + standing[i][3][prob][0].to_s
			end
			tmp << str
			prob.succ!
		end
		
		puts tmp.join ' '
	end
end

C++14(g++5.4) 解法, 执行用时: 282ms, 内存消耗: 748K, 提交时间: 2019-11-23 12:04:29

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
const int maxn = 55;
using namespace std;

struct node{
	string name;
	int vis[13], v[13], tim[13];
	int tot, T;
	bool operator < (const node & rhs) const{
		if(tot != rhs.tot)
			return tot > rhs.tot;
		else if(T != rhs.T)
			return T < rhs.T;
		else
			return name < rhs.name;
	}
}p[maxn];

map<string, int>mp;
string s, t;
int key(char x)
{
	return x - 'A';	
}

int main()
{
	int kase;
	cin >> kase;
	for(int kk = 1; kk <= kase; kk++)
	{
		if(kk != 1)
			cout << endl;
		mp.clear();
		int n, m;
		cin >> n >> m;
		for(int i = 1; i <= m; i++)
		{
			for(int j = 0; j < 13; j++)		
			{
				p[i].vis[j] = p[i].v[j] = 0;
			}
			p[i].T = p[i].tot = 0;
		}
		for(int i = 1; i <= m; i++)
		{
			cin >> p[i].name;
			mp[p[i].name] = i;
		}
		int q, now;
		char ch;
		cin >> q;
		while(q--)
		{
			cin >> s >> now >> ch >> t;		
			int k = mp[s], tt = key(ch);
			if(t[0] == 'C' || p[k].vis[tt])
			{
				continue;
			}
			else
			{
				if(t[0] == 'A')
				{
					p[k].vis[tt] = 1;
					p[k].tot++;
					p[k].T += p[k].v[tt]*20 + now;
					p[k].tim[tt] = now;
				}
				p[k].v[tt]++;
			}
		}
		sort(p+1, p+m+1);
		int rank;
		for(int i = 1; i <= m; i++)
		{
			if(i == 1 || (p[i].T != p[i-1].T || p[i].tot != p[i-1].tot))
				rank = i;
			printf("%d %s %d %d", rank, p[i].name.c_str(), p[i].tot, p[i].T);
			for(int j = 0; j < n; j++)
			{
				if(p[i].vis[j])		
				{
					printf(" +%d(%d)", p[i].v[j], p[i].tim[j]);		
				}
				else
				{
					printf(" -%d", p[i].v[j]);			
				}
			}
			puts("");
		}
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 407ms, 内存消耗: 608K, 提交时间: 2019-11-17 17:44:22

#include<cstdio>
#include<iostream>
#include<tr1/unordered_map>
#include<algorithm>
using namespace std;
const int N=55;
struct Node{
	string name;
	int ts,zsj,tj[N],tg[N],sj[N];
	bool operator<(const Node &n1)const{
		return ts==n1.ts ? (zsj==n1.zsj ? name<n1.name : zsj<n1.zsj): ts>n1.ts;
	}
}a[N];
tr1::unordered_map<string,int> mmp;
int main(){
	int t,n,m;
	string s;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		mmp.clear();
		for(int i=1;i<=m;i++){
			cin>>s;
			a[i].name=s;
			mmp[s]=i;
			for(int j=1;j<=n;j++){
				a[i].ts=a[i].zsj=0;
				a[i].tg[j]=a[i].tj[j]=a[i].sj[j]=0;
			}
		}
		int q,id,th,sj;
		scanf("%d",&q);
		while(q--){
			cin>>s;id=mmp[s];
			cin>>sj;cin>>s;th=s[0]-'A'+1;
			cin>>s;
			if(a[id].tg[th]) continue;
			if(s[0]=='A'){
				a[id].tg[th]=1;a[id].ts++;
				a[id].sj[th]=sj;
				a[id].zsj+=sj+20*a[id].tj[th];
				a[id].tj[th]++;
			}else if(s[0]!='C') a[id].tj[th]++;
		}
		sort(a+1,a+1+m);
		for(int i=1,ra=1;i<=m;i++){
			if(i>1&&(a[i].ts!=a[i-1].ts||a[i].zsj!=a[i-1].zsj)) ra=i;
			cout<<ra<<" "<<a[i].name<<" "<<a[i].ts<<" "<<a[i].zsj;
			for(int j=1;j<=n;j++){
				printf(" ");
				if(a[i].tg[j]){
					printf("+%d(%d)",a[i].tj[j],a[i].sj[j]);
				}else printf("-%d",a[i].tj[j]);
			}
			printf("\n");
		}
		if(t) printf("\n");
	}
	return 0;
} 

上一题