
题目描述你是ACM\texttt{ACM}ACM程序设计竞赛的裁判长。已知所有提交记录的日志每条记录包含队伍编号≤25\le 25≤25、题目编号A到G、提交时间h:mm、运行结果Y表示通过N表示未通过。需要计算最终排名规则如下排名按解决问题数量降序排列若解题数相同按总用时升序排列。总用时为所有已解决问题的用时之和每道已解决问题的用时为该题首次通过时的提交时刻从比赛开始到提交的分钟数加上该题此前被拒绝的提交次数乘以202020分钟。同一题的后续提交在首次通过之后被忽略。未解决问题的用时不计入总用时。若两个队伍解题数和总用时完全相同则排名相同并按队伍编号升序输出。输入格式输入第一行为测试用例个数随后有一个空行。每个测试用例包含若干行提交记录直到遇到空行。每行格式为队伍编号、题目字母、提交时间h:mm、状态Y/N。队伍编号为111到252525题目为A到G。所有记录可能无序按时间先后输入。输出格式对于每个测试用例输出表头RANK TEAM PRO/SOLVED TIME然后按排名输出每个参赛队伍格式为排名右对齐444列、队伍编号右对齐555列、解题数右对齐555列、总用时右对齐111111列。若解题数为000则只输出排名和队伍编号不输出解题数和时间。多个测试用例输出之间用空行分隔。排名相同的队伍并列同一排名但下一不同排名需跳过相应名次例如两支队伍并列第111则下一支队伍排名为333。样例输入1 1 A 0:50 N 3 A 1:12 Y 2 B 1:19 N 1 A 1:20 Y 2 B 1:35 N 1 B 1:36 N 3 B 1:40 Y 3 C 1:41 N 4 A 1:40 Y样例输出RANK TEAM PRO/SOLVED TIME 1 3 2 172 2 1 1 100 2 4 1 100 4 2题目分析每条记录需要按时间排序但输入本身可能已按时间顺序但为保证正确性仍需排序。对每个队伍维护每道题的通过状态、拒绝次数和通过时间。处理时若题目已通过则忽略后续记录若未通过则根据状态更新拒绝次数或记录通过时间。所有记录处理完毕后计算每队的解题总数和总用时。然后按规则排序并输出。解题思路实现步骤确定如下步骤1\texttt{1}1. 读入测试用例个数跳过空行。对每个用例初始化队伍数组队伍编号从111到252525但实际可能出现的最小编号为111最大不超过252525。步骤2\texttt{2}2. 读取所有提交记录存入结构体数组包含队伍编号转为000基、题目编号000到666、提交分钟数hh×60mmhh \times 60 mmhh×60mm、是否通过111为通过000为未通过。步骤3\texttt{3}3. 按提交时间升序排序记录。步骤4\texttt{4}4. 遍历排序后的记录若该队伍该题已通过则跳过否则若状态为N则该题拒绝次数加111若状态为Y则标记为已通过解题数加111记录该题用时为当前提交分钟数加上20×20 \times20×拒绝次数。步骤5\texttt{5}5. 所有记录处理完后计算每队总用时已通过题目的用时之和。标记哪些队伍至少有一条记录appeared\textit{appeared}appeared。步骤6\texttt{6}6. 按规则排序先按appeared\textit{appeared}appeared降序未出现的队伍排在最后但输出时可忽略再按解题数降序再按总用时升序最后按队伍编号升序。步骤7\texttt{7}7. 输出时遍历队伍只输出appeared\textit{appeared}appeared的队伍。排名计算若当前队伍与前一名成绩不同则排名更新为当前实际位置从111开始计数否则与前一排名相同。代码实现// Head Judge Headache// UVa ID: 790// Verdict: Accepted// Submission Date: 2018-01-11// UVa Run Time: 0.010s//// 版权所有C2018邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;structteam{inttid,solved[8],rejected[8],consumed[8],totalT,totalP,appeared;booloperator(constteamt)const{if(appeared!t.appeared)returnappearedt.appeared;if(totalP!t.totalP)returntotalPt.totalP;if(totalT!t.totalT)returntotalTt.totalT;returntidt.tid;}}teams[32];structrecord{inttid,pid,hh,mm,solved,elapsed;booloperator(constrecordl)const{if(elapsed!l.elapsed)returnelapsedl.elapsed;returnsolvedl.solved;}}records[10240];intmain(intargc,char*argv[]){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);intcases,tid,pid,hh,mm,solved,maxTeamId,recordCnt;charpletter,separator,status;istringstream iss;string line;cincases;cin.ignore(1024,\n);getline(cin,line);for(intC1;Ccases;C){memset(teams,0,sizeof(teams));for(inti0;i25;i)teams[i].tidi1;maxTeamId-1;recordCnt0;while(getline(cin,line)){if(line.length()0)break;iss.clear();iss.str(line);isstidpletterhhseparatormmstatus;records[recordCnt]record{tid-1,pletter-A,hh,mm,statusY?1:0,hh*60mm};}sort(records,recordsrecordCnt);for(inti0;irecordCnt;i){tidrecords[i].tid,pidrecords[i].pid,hhrecords[i].hh,mmrecords[i].mm,solvedrecords[i].solved;maxTeamIdmax(maxTeamId,tid);if(teams[tid].solved[pid])continue;else{if(!solved)teams[tid].rejected[pid];else{teams[tid].solved[pid]1;teams[tid].totalP;teams[tid].consumed[pid]hh*60mm20*teams[tid].rejected[pid];}}}for(inti0;i25;i)for(intj0;j7;j)teams[i].totalTteams[i].consumed[j];for(inti0;imaxTeamId;i)teams[i].appeared1;sort(teams,teams25);if(C1)cout\n;coutRANK TEAM PRO/SOLVED TIME\n;for(inti0,showRank1,trueRank1;i25;i,trueRank){if(!teams[i].appeared)break;if(i){if(teams[i].totalP!teams[i-1].totalP||teams[i].totalT!teams[i-1].totalT)showRanktrueRank;}coutsetw(4)rightshowRank;coutsetw(5)rightteams[i].tid;if(teams[i].totalP){coutsetw(5)rightteams[i].totalP;coutsetw(11)rightteams[i].totalT;}cout\n;}}return0;}总结本题模拟ACM\texttt{ACM}ACM竞赛排名规则关键在于正确处理每道题的提交记录按时间排序统计拒绝次数和通过时间忽略通过后的提交。总用时计算包括罚时。排名时处理并列名次并输出只有解题数为000的队伍时不显示解题数和时间。输入格式包含空行分隔测试用例需要妥善处理。该解法使用结构体排序清晰且易于扩展。时间复杂度O(RlogRT)O(R \log R T)O(RlogRT)其中RRR为记录数TTT为队伍数满足题目限制。