STL综合案例(学校演讲比赛)
比赛规则:某市举行一场演讲比赛( speech_contest ),共有24个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。
分组比赛,每组6个人;选手每次要随机分组,进行比赛;第一轮分为4个小组,每组6个人。比如编号为: 100-123. 整体进行抽签(draw)后顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。第二轮分为2个小组,每组6人。比赛完毕,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。第三轮只剩下1组6个人,本轮为决赛,选出前三名。
比赛评分:10个评委打分,去除最低、最高分,求平均分每个选手演讲完由10个评委分别打分。该选手的最终得分是去掉一个最高分和一个最低分,求得剩下的8个成绩的平均分。选手的名次按得分降序排列。
要求:用STL编程,求解这个问题
1) 请打印出所有选手的名字与参赛号,并以参赛号的升序排列。
2) 打印每一轮比赛后,小组比赛成绩和小组晋级名单
#include<iostream>
#include<vector>
#define _CRT_SECURE_NO_WARNINGS
#include<algorithm>
#include<string>
#include<map>
#include<deque>
#include<iterator>
#include<functional>
#include<numeric>
#include<ctime>
using namespace std;
/*
1) 产生选手 ( ABCDEFGHIJKLMNOPQRSTUVWX ) 姓名、得分;选手编号
2) 第1轮 选手抽签 选手比赛 查看比赛结果
3) 第2轮 选手抽签 选手比赛 查看比赛结果
4) 第3轮 选手抽签 选手比赛 查看比赛结果
*/
class Speaker
{
public:
string m_Name; //姓名
int m_Score[3]; //得分数组
};
void createSpeaker(vector<int>&v, map<int,Speaker>&m)
{
string nameSeed = "ABCDEFGHIJKLMNOPQRSTUVWX";
for (int i = 0; i < nameSeed.size(); i++)
{
string name = "选手";
name += nameSeed[i];
Speaker sp;
sp.m_Name = name;
for (int j = 0; j < 3; j++)
{
sp.m_Score[j] = 0;
}
v.push_back(i + 100); //编号为100~123
m.insert(make_pair(i + 100, sp));
}
}
void speechDraw(vector<int>v)
{
//洗牌
random_shuffle(v.begin(), v.end());
}
//index表示第几轮 v1是比赛选手编号 m是选手编号和具体选手 v2是晋级选手编号容器
void speechContest(int index, vector<int>&v1, map<int, Speaker>&m, vector<int>&v2)
{
multimap<int, int, greater<int>> groupMap; //key分数 value编号
int num = 0;
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
num++;
deque<int>d;
for (int i = 0; i < 10; i++)
{
int score = rand() % 41 + 60; //60~100
d.push_back(score);
}
//排序
sort(d.begin(), d.end());
//去除最高最低分
d.pop_back();
d.pop_front();
//累积分数
int sum = accumulate(d.begin(), d.end(), 0);
int avg = sum / d.size();
//将平均分 放入到m容器中
m[*it].m_Score[index - 1] = avg;
//每6个人取前三名晋级
//临时容器保存6个人
//临时容器存放数据
groupMap.insert(make_pair(avg, *it));
if (num % 6 == 0)
{
/*cout << "小组比赛如下:" << endl;
for (multimap<int, int, greater<int>>::iterator mit = groupMap.begin(); mit != groupMap.end(); mit++)
{
cout << "编号:" << mit->second << "姓名:" << m[mit->second].m_Name << "得分:" << m[mit->second].m_Score[index-1] << endl;
}*/
//取前三名
int count = 0;
for (multimap<int, int, greater<int>>::iterator mit = groupMap.begin(); mit != groupMap.end(), count < 3; mit++, count++)
{
//晋级容器获取数据
v2.push_back(mit->second);
}
groupMap.clear(); //清空临时容器
}
}
}
void showScore(int index, vector<int>&v, map<int,Speaker>&m)
{
cout << "第" << index << "轮比赛成绩如下:" << endl;
for (map<int, Speaker>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "选手编号:" << it->first << "姓名:" << it->second.m_Name << "分数:" << it->second.m_Score[index-1] << endl;
}
cout << "晋级选手编号:" << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << endl;
}
}
int main()
{
//随机数种子
srand((unsigned int)time(NULL));
vector<int>v1; //选手编号
map<int, Speaker>m; //存放选手编号和对应的具体选手
//创建选手
createSpeaker(v1,m);
//测试
/*for (map<int, Speaker>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "编号:" << it->first << " 姓名" << it->second.m_Name << endl;
}*/
//抽签
speechDraw(v1);
vector<int>v2; //进入下一轮比赛的人员编号
//比赛
speechContest(1, v1, m, v2);
//显示比赛结果
showScore(1, v2, m);//轮数 晋级编号 具体的人员信息
//第二轮比赛
speechDraw(v2);
vector<int>v3;
speechContest(2, v2, m, v3);
showScore(2, v3, m);
//第三轮比赛
speechDraw(v3);
vector<int>v4;
speechContest(3, v3, m, v4);
showScore(3, v4, m);
system("pause");
return 0;
}