#include <iostream>
#include <map>
#include <vector>
#include <stack>
#include <deque>
#include <algorithm>
#include <functional>
#include <time.h>
#include <cmath>
#include <numeric>
using namespace std;
#define MAX 100
class Competitor
{
public:
int score[3];
char name;
};
void initCompetitor(vector<int>&v, map<int, Competitor>&m)
{
Competitor c;
for (int i = 1; i <= 24; i++)
{
for (int j = 0; j < 3; j++)
{
c.score[j] = 0;
}
c.name = 64 + i;
v.push_back(i);
m.insert(make_pair(i,c));
}
}
void setGroup(vector<int>v)
{
random_shuffle(v.begin(), v.end());//洗牌算法
}
void Judge(int index,vector<int>& v, map<int, Competitor>& m,vector<int>&pass)
{
vector<int>::iterator itV;
vector<int>::iterator itP;
multimap<int, int,greater<int>> m2;//key为分数,value为编号
int score = 0;
int tmp = 0;
for (itV = v.begin(); itV != v.end(); itV++)
{
deque<int> d;
int ave = 0;
int sumScore = 0;
for (int i = 0; i < 10; i++)
{
score = rand() % 41 + 60;
d.push_back(score);
}
sort(d.begin(),d.end());
d.pop_front();
d.pop_back();
sumScore = accumulate(d.begin(), d.end(), 0);
ave = sumScore / 8;
m.at(*itV).score[index] = ave;
m2.insert(make_pair(ave, *itV));
tmp++;
if (tmp % 6 == 0)
{
int tmp2 = 0;
cout << "小组比赛成绩如下" << endl;
for (multimap<int, int, greater<int>>::iterator mit = m2.begin(); mit != m2.end(),tmp2<3; mit++,tmp2++)
{
cout << "number " << (mit->second) << " name " << m.at(mit->second).name << " score " << m[mit->second].score[index] << endl;
pass.push_back(mit->second);
}
m2.clear();
}
}
}
void display(vector<int>& pass01, int index)
{
cout << "------------------------------------------------" << endl;
cout << "第" << index + 1 << "轮晋级选手如下" << endl;
for (vector<int>::iterator it = pass01.begin(); it != pass01.end(); it++)
{
cout << *it<< " ";
}
cout << endl;
}
int main()
{
//轮数
int index = 0;
srand((unsigned)time(NULL));
//比赛组
vector<int> v;
vector<int> pass01;
vector<int> pass02;
vector<int> pass03;
//存放参赛号
map<int, Competitor>m;
//存放分数
map<int, int>mScore;
//初始化个人信息
initCompetitor(v,m);
//抽签
setGroup(v);
//打分,淘汰,输出
//第一轮
Judge(index, v, m, pass01);
display(pass01,index);
index++;
//第二轮
Judge(index, pass01, m, pass02);
display(pass02, index);
index++;
//第三轮
Judge(index, pass02, m, pass03);
cout <<endl<< "前三名编号分别是" << endl;
display(pass03, index);
return 0;
}