案例:学校演讲比赛
1)某市举行一场演讲比赛,共有24个人参加,按参加顺序设置参赛号。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。
2)比赛方式:分组比赛
第一轮分为4个小组,根据参赛号顺序依次划分,比如100-105为一组,106-111为第二组,依次类推,每组6个人,每人分别按参赛号顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
第二轮分为2个小组,每组6人,每个人分别按参赛号顺序演讲。当小组完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
第三轮只剩下6个人,本轮为决赛,选出前三名。
选手每次要随机分组,进行比赛。
4)比赛评分:10个评委打分,去除最低、最高分,求平均分
每个选手演讲完由10个评委分别打分。该选手的最终得分是去掉一个最高分和一个最低分,求得剩下的8个成绩的平均分。选手的名次按得分降序排列,若得分一样,按参赛号升序排名。
用STL编程,求解一下问题
1) 请打印出所有选手的名字与参赛号,并以参赛号的升序排列。
2) 打印每一轮比赛前,分组情况
3) 打印每一轮比赛后,小组晋级名单
打印决赛前三名,选手名称、成绩。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<functional>
#include<numeric>
#include<map>
#include<deque>
using namespace std;
class Speacker {
public:
string m_name;
int m_score[3]; // 三轮比赛的得分
};
//产生选手
int Generate_speacker(map<int, Speacker> &mapSpeacker, vector<int> &v) {
string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
random_shuffle(str.begin(), str.end());
for (int i = 0; i < 24; i++) {
Speacker tmp;
tmp.m_name = "选手";
tmp.m_name = tmp.m_name + str[i];
mapSpeacker.insert(pair<int, Speacker>(100 + i, tmp));
}
for (int i = 0; i < 24; i++) {
v.push_back(100 + i); //参加比赛人员
}
return 0;
}
// 选手抽签
int speech_contest_draw(vector<int>& v) {
random_shuffle(v.begin(), v.end());
return 0;
}
// 选手比赛
int speech_contest(int index, vector<int>& v1, map<int, Speacker>& mapSpeacker, vector<int>& v2) {
// 小组比赛得分记录;求出前三名
multimap<int, int, greater<int>> multimapGroup; //小组成绩
int tmpCount = 0;
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) {
tmpCount++;
// 打分
{
deque<int> dscore;
for (int j = 0; j < 10; j++) { // 10个评委打分
int score = 50 + rand() % 50;
dscore.push_back(score);
}
sort(dscore.begin(), dscore.end());
dscore.pop_back(); // 去除最高分
dscore.pop_front(); // 去除最低分
// 求平均
int scoresum = accumulate(dscore.begin(), dscore.end(), 0);
int scoreavg = scoresum / dscore.size();
mapSpeacker[*it].m_score[index] = scoreavg; //选手得分存入容器
multimapGroup.insert(pair<int, int>(scoreavg, *it));
}
// 处理分组
if (tmpCount % 6 == 0) {
cout << "小组比赛成绩:" << endl;
for (multimap<int, int, greater<int>>::iterator mit = multimapGroup.begin(); mit != multimapGroup.end(); mit++) {
//编号 姓名 得分
cout << mit->second << "\t" << mapSpeacker[mit->second].m_name << "\t" << mit->first << endl;
}
// 前三名晋级
while (multimapGroup.size() > 3) {
multimap<int, int, greater<int>>::iterator it1 = multimapGroup.begin();
v2.push_back(it1->second);
multimapGroup.erase(it1);
}
multimapGroup.clear(); //清空本小组比赛
}
}
return 0;
}
// 查看比赛结果
int speech_contest_print(int index, vector<int>& v, map<int, Speacker>& mapSpeacker) {
cout << "第" << index + 1 << "轮晋级名单" << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << "参赛编号:" << *it << "\t" << mapSpeacker[*it].m_name << "\t" << mapSpeacker[*it].m_score[index] << endl;
}
return 0;
}
void main() {
map<int, Speacker> mapSpeacker; //参加比赛选手
vector<int> v1; //第1轮演讲比赛名单
vector<int> v2; //第2轮演讲比赛名单
vector<int> v3; //第3轮演讲比赛名单
vector<int> v4; //第4轮演讲比赛名单
// 产生选手 得到第1轮选手名单
Generate_speacker(mapSpeacker, v1);
// 第1轮 选手抽签 比赛 出结果
cout << "\n\n\n任意键,开始第1轮" << endl;
cin.get();
speech_contest_draw(v1);
speech_contest(0, v1, mapSpeacker, v2);
speech_contest_print(0, v2, mapSpeacker);
// 第2轮 选手抽签 比赛 出结果
cout << "\n\n\n任意键,开始第2轮" << endl;
cin.get();
speech_contest_draw(v2);
speech_contest(1, v2, mapSpeacker, v3);
speech_contest_print(1, v3, mapSpeacker);
// 第3轮 选手抽签 比赛 出结果
cout << "\n\n\n任意键,开始第3轮(决赛)" << endl;
cin.get();
speech_contest_draw(v3);
speech_contest(2, v3, mapSpeacker, v4);
speech_contest_print(2, v4, mapSpeacker);
}
结果
任意键,开始第1轮
小组比赛成绩:
106 选手Z 83
111 选手F 80
104 选手A 77
121 选手T 73
112 选手O 73
108 选手E 70
小组比赛成绩:
102 选手J 76
115 选手Q 75
118 选手U 73
123 选手K 72
109 选手P 68
101 选手B 68
小组比赛成绩:
120 选手I 79
119 选手R 76
113 选手N 75
110 选手S 74
107 选手V 73
117 选手D 64
小组比赛成绩:
114 选手X 80
100 选手M 80
103 选手Y 79
116 选手G 72
105 选手L 69
122 选手W 67
第1轮晋级名单
参赛编号:106 选手Z 83
参赛编号:111 选手F 80
参赛编号:104 选手A 77
参赛编号:102 选手J 76
参赛编号:115 选手Q 75
参赛编号:118 选手U 73
参赛编号:120 选手I 79
参赛编号:119 选手R 76
参赛编号:113 选手N 75
参赛编号:114 选手X 80
参赛编号:100 选手M 80
参赛编号:103 选手Y 79
任意键,开始第2轮
小组比赛成绩:
106 选手Z 87
119 选手R 81
103 选手Y 79
115 选手Q 76
118 选手U 70
104 选手A 66
小组比赛成绩:
100 选手M 76
111 选手F 75
102 选手J 74
120 选手I 72
114 选手X 72
113 选手N 68
第2轮晋级名单
参赛编号:106 选手Z 87
参赛编号:119 选手R 81
参赛编号:103 选手Y 79
参赛编号:100 选手M 76
参赛编号:111 选手F 75
参赛编号:102 选手J 74
任意键,开始第3轮(决赛)
小组比赛成绩:
119 选手R 82
111 选手F 77
102 选手J 74
103 选手Y 71
106 选手Z 67
100 选手M 63
第3轮晋级名单
参赛编号:119 选手R 82
参赛编号:111 选手F 77
参赛编号:102 选手J 74