NC54668. 排序
描述
输入描述
第一行包括一个整数 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; }