#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include<string>
#include<vector>
#include<deque>
#include<map>
#include<algorithm>
#include<functional>
#include"iterator" //输出迭代器的头文件
#include<numeric>
class Speaker
{
public:
string name;
int score[3];//三轮比赛得分
};
void printM(map<int,Speaker> M)
{
for (map<int, Speaker>::iterator it = M.begin(); it != M.end(); ++it)
{
pair<int, Speaker> pr = *it;
int iKey = pr.first;
string strValue = pr.second.name;
cout << iKey << "\t" << strValue << endl;
}
}
//创建选手函数
void GenSpeaker(map<int,Speaker> &SpeakerList,vector<int> &v1)
{
string SeedName = "ABCDEFGHIGKLMNOPQRSTUVWXYZ";
for (int i = 0; i < 24; i++)
{
//姓名
Speaker SP;
SP.name = "选手";
SP.name = SP.name + SeedName[i];
for (int j = 0; j < 3; j++)
{
SP.score[j] = 0;
}
//编号
int uID = 100 + i;
//map插入选手编号和信息
SpeakerList.insert(pair<int, Speaker>(uID, SP));
//vector插入选手编号
v1.push_back(uID);
}
}
//随机抽签
void Set_Random(vector<int> &v1)
{
random_shuffle(v1.begin(),v1.end());
}
//比赛打分
void Set_Score(int index, vector<int> &v1, map<int, Speaker> &SpeakerList, vector<int> &v2)
{
int groupIndex = 0;
map<int, int, greater<int>> mapGroup;//存放小组编号和成绩
vector<int> ::iterator it;
deque<int> Dscore;
for (it = v1.begin(); it != v1.end(); it++)
{
//10个评委打分
for (int j = 0; j < 10; j++)
{
int score = rand() % 40 + 60;
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();
//选手得分存入容器中
SpeakerList[*it].score[index-1] = scoreAvg;//第index轮得分
mapGroup.insert(pair<int, int>(*it, scoreAvg));//编号和成绩
groupIndex++;
//处理分组
if (groupIndex % 6 == 0)
{
cout << "第"<< groupIndex/6 <<"小组比赛成绩:" << endl;
//编号 姓名 得分
for (map<int, int,greater<int>>::iterator it = mapGroup.begin(); it != mapGroup.end(); it++)
{
cout << it->first << "\t" << SpeakerList[it->first].name << "\t" << it->second << endl;
}
//前三名晋级
while (mapGroup.size() > 3)
{
map<int, int, greater<int>>::iterator it = mapGroup.begin();
v2.push_back(it->first);//前三名编号放到v2
mapGroup.erase(it);
}
mapGroup.clear();//清空本小组比赛成绩
}
}
}
//晋级
void Show_Good(int index, vector<int> &v1, map<int, Speaker> &SpeakerList)
{
cout << "第" << index << "轮晋级名单:" << endl;
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
//编号 姓名 得分
cout << *it << "\t" << SpeakerList[*it].name << "\t" << SpeakerList[*it].score[index-1] << endl;
}
}
void main()
{
//创建容器,存放选手信息
map<int, Speaker> mapSpeaker;
//第一轮比赛参赛列表24人晋级12人
vector<int> v1;
//第二轮比赛参赛列表12人晋级6人
vector<int> v2;
//第三轮比赛参赛列表6人晋级3人
vector<int> v3;
//最后前三名
vector<int> v4;
//创建选手,得到第一轮选手的比赛名单
GenSpeaker(mapSpeaker, v1);
//输出参赛选手信息
cout << "参赛选手信息:" << endl;
printM(mapSpeaker);
/*第一轮比赛*/
cout << "第一轮比赛:" << endl;
//随机分配
Set_Random(v1);
//打分
Set_Score(1, v1, mapSpeaker, v2);
//晋级
Show_Good(1, v2, mapSpeaker);
/*第二轮比赛*/
cout << "第二轮比赛:" << endl;
//随机分配
Set_Random(v2);
//打分
Set_Score(2, v2, mapSpeaker, v3);
//晋级
Show_Good(2, v3, mapSpeaker);
/*第三轮比赛*/
cout << "第三轮比赛:" << endl;
//随机分配
Set_Random(v3);
//打分
Set_Score(3, v3, mapSpeaker, v4);
//晋级
Show_Good(3, v4, mapSpeaker);
system("pause");
}