HM273 十评委小组赛
HM273 十评委小组赛
来源: 第 273 集 演讲比赛流程管理系统-比赛功能实现
难度: 普及
时间限制: 1s
空间限制: 64MB
题目描述
封装 speechContest。这是整届流程里最绕的一段,必须按容器和算法一步步做,不能只算一个平均数交差。
先看 m_Index:轮数为 \(1\) 时,参赛编号来自 v1;否则来自 v2。把选中的容器拷到 vSrc,再用迭代器按抽签顺序走遍每一个编号。
每名选手由 \(10\) 个评委打分,分数放进 deque<double>。课堂上用 (rand() % 401 + 600) / 10.f 得到 \(60.0\) 到 \(100.0\) 的一位小数;本题由输入直接给出这 \(10\) 个数,不要自己调用随机数。
对双端队列做 sort,比较器用内建函数对象 greater<double>(),得到从大到小的序列。此时 pop_front 去掉最高分,pop_back 去掉最低分。也允许默认升序后再去两端,但本题按降序来写,用来练习函数对象。
剩下 \(8\) 个数用 accumulate 累加,起始值写成 0.0f。平均分是总分除以 d.size(),要把 size() 强转成 double,否则整数相除会丢掉小数。把平均分写入 m_Speaker[编号].score[m_Index - 1]。
只放进选手表还不够:还要取出每组前三名。另建临时 multimap<double, int, greater<double>> groupScore,键是平均分,值是编号。用 multimap 而不是 map,是因为小数分仍有极低概率撞车,重复键必须能插进去。降序插入后,从头取 \(3\) 个就是前三名。
用计数器 personCount,每处理一人加一。当 personCount % 6 == 0 时,这一组满员:输出 第K小组比赛名次如下(\(K=personCount/6\)),按 groupScore 顺序打印全组编号、姓名、本轮得分;再取前三名——第一轮 push_back 进 v2,第二轮进 vVictory。**一组处理完必须 groupScore.clear()**,否则第二组会残留第一组的人,变成 \(12\) 人。
全部选手走完后输出 第X轮比赛完毕。
输入格式
第一行两个整数 \(roundIndex\)、\(n\)(\(roundIndex \in \{1,2\}\),\(n\) 为 \(6\) 或 \(12\),且是 \(6\) 的倍数)。
第二行 \(n\) 个编号,为该轮抽签后的顺序,写入 v1 或 v2。
接下来 \(n\) 行,每行:编号、姓名、随后 \(10\) 个实数评委分。这 \(n\) 行与第二行是同一批人,顺序可以不同。
输出格式
第一行:第、轮数、轮比赛正式开始。
对每一组:
- 一行
第K小组比赛名次如下 - \(6\) 行:编号、姓名、平均分(一位小数),按分数降序;分数相同则按
multimap稳定插入顺序(本题数据保证分数互不相同)。
各组之间不空行。最后一行:第、轮数、轮比赛完毕。行末换行。
样例
输入 #1
1 12
10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012
10001 选手A 100 90 90 90 90 90 90 90 90 60
10002 选手B 100 85 85 85 85 85 85 85 85 60
10003 选手C 100 80 80 80 80 80 80 80 80 60
10004 选手D 100 75 75 75 75 75 75 75 75 60
10005 选手E 100 70 70 70 70 70 70 70 70 60
10006 选手F 100 65 65 65 65 65 65 65 65 60
10007 选手G 100 88 88 88 88 88 88 88 88 60
10008 选手H 100 86 86 86 86 86 86 86 86 60
10009 选手I 100 84 84 84 84 84 84 84 84 60
10010 选手J 100 82 82 82 82 82 82 82 82 60
10011 选手K 100 81 81 81 81 81 81 81 81 60
10012 选手L 100 79 79 79 79 79 79 79 79 60
输出 #1
第1轮比赛正式开始
第1小组比赛名次如下
10001 选手A 90.0
10002 选手B 85.0
10003 选手C 80.0
10004 选手D 75.0
10005 选手E 70.0
10006 选手F 65.0
第2小组比赛名次如下
10007 选手G 88.0
10008 选手H 86.0
10009 选手I 84.0
10010 选手J 82.0
10011 选手K 81.0
10012 选手L 79.0
第1轮比赛完毕
输入 #2
2 6
10009 10001 10008 10003 10007 10002
10001 选手A 100 91 91 91 91 91 91 91 91 60
10002 选手B 100 80 80 80 80 80 80 80 80 60
10003 选手C 100 92 92 92 92 92 92 92 92 60
10007 选手G 100 90 90 90 90 90 90 90 90 60
10008 选手H 100 79 79 79 79 79 79 79 79 60
10009 选手I 100 78 78 78 78 78 78 78 78 60
输出 #2
第2轮比赛正式开始
第1小组比赛名次如下
10003 选手C 92.0
10001 选手A 91.0
10007 选手G 90.0
10002 选手B 80.0
10008 选手H 79.0
10009 选手I 78.0
第2轮比赛完毕
说明
平均分 \(=\) accumulate 的和 \(\div 8\)。必须用 deque 去两端,必须用 multimap 按分降序取前三,必须在每组结束后清空。样例 1 是第一轮两组;样例 2 是第二轮一组。评测不会检查 v2 / vVictory 的内存,但实现里仍应按轮次把前三名放进对应容器。
信息
- ID
- 1272
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者