学校演讲比赛介绍:
1.学校举行演讲比赛,共有24人参加。比赛分为三轮,前两轮为淘汰赛,第三轮为决赛;
2.比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛;
第一轮分为4组,每组6个人。如:100-105为一组,106-111位第二组...
每人分别按照抽签顺序演讲,当小组演讲完后,淘汰组内排名最后的三个选手,继续下一个小组的比赛
第二轮分为2组,每组6人,如上操作
第三轮只剩下6个人,本轮为决赛,选出前三名
3.比赛评分:10个评委打分,去掉最低,最高分,求平均分(选手的名次按得分降序排列,若得分一样,按参赛号升序排名)
思路:
第一步:创建24个学生 因为每个学生都有参赛编号,参赛编号唯一,放在map容器中 key:编号,value:选手对象
vector<int> v1 第一轮参赛的编号列表 map[编号],random_shuffle
第一轮比赛的晋级名单 vector<int> v2;作为第二轮的参赛编号名单
第二轮比赛的晋级名单 放在vector<int> v3;
第三轮比赛参赛名单 v3 参赛 结果前三名 放在v4;
代码:
#define _CRT_SECURE_NO_WARINGS
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
#include<numeric>
#include<functional>
#include<deque>
#include<time.h>
using namespace std;
class Player {
public:
string mName;
int mScore[3];
};
//创建选手
void Creat_Player(map<int, Player>& mPlist, vector<int>& v1)
{
string seedName = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i = 0; i < 24; i++)
{
Player p;
p.mName = "选手";
p.mName +=seedName[i];
for (int j=0; j < 3; j++)
{
p.mScore[j] = 0;
}
int uID = 100 + i;
mPlist.insert(make_pair(uID, p)); //保存选手个人信息
v1.push_back(uID);
}
}
//选手抽签
void Set_Random(vector<int>& v1)
{
random_shuffle(v1.begin(), v1.end());
}
//比赛
void Set_Score(int index, vector<int>& vIn, map<int, Player>& mPlist, vector<int>& vOut)
{
srand((unsigned int)time(NULL)); //随机种子
//第1个int 分数 根据分数自动排序
//第2个int 编号
multimap<int, int,greater<int>>mGroup; //默认根据分数从小到大
int groupIndex = 0;
for (vector<int>::iterator it = vIn.begin(); it != vIn.end(); it++)
{
//打分
deque<int> dScore;
for (int i = 0; i < 10; i++)
{
int score = rand() % 40 + 60; //60-100
dScore.push_back(score);
}
//排序
sort(dScore.begin(), dScore.end());
//去除最低 最高
dScore.pop_back();
dScore.pop_front();
//求平均分
int totalScore = accumulate(dScore.begin(), dScore.end(),0);
int avgScore = totalScore / dScore.size();
mPlist[*it].mScore[index - 1] = avgScore;
//把当前选手编号放到mGroup
mGroup.insert(make_pair(avgScore, *it));
groupIndex++;
if (groupIndex % 6 == 0)
{
int numIndex=0;
for (multimap<int, int>::iterator mit = mGroup.begin(); mit != mGroup.end(); mit++)
{
if (numIndex >= 3)
{
break;
}
vOut.push_back((*mit).second); //second:取编号
numIndex++;
}
mGroup.clear();
}
}
}
//打印晋级名单
void Show_Good_Player(int index, vector<int>& v, map<int, Player>& mPlist)
{
cout << "第" << index << "轮晋级名单" << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << "姓名:" << mPlist[*it].mName << " 分数: " << mPlist[*it].mScore[index - 1] << endl;
}
}
int main(void)
{
//定义map容器 根据编号保存选手信息
map<int, Player> mPlist;
//第一轮比赛参赛列表
vector<int> v1; //24个人 晋级12人
//第二轮比赛参数列表 //12个人 晋级6人
vector<int> v2;
//第三轮比赛参数列表 //6个人 晋级3人
vector<int> v3;
//最终前三名
vector<int> v4;
//创建选手
Creat_Player(mPlist, v1);
//第一轮比赛
Set_Random(v1);
Set_Score(1,v1, mPlist, v2);
Show_Good_Player(1,v2, mPlist);
//第二轮比赛
Set_Random(v2);
Set_Score(2, v2, mPlist, v3);
Show_Good_Player(2, v3, mPlist);
//第三轮比赛
Set_Random(v3);
Set_Score(3, v3, mPlist, v4);
Show_Good_Player(3, v4, mPlist);
return 0;
}
结果:
第1轮晋级名单
姓名:选手C 分数: 83
姓名:选手L 分数: 81
姓名:选手B 分数: 80
姓名:选手P 分数: 87
姓名:选手E 分数: 83
姓名:选手H 分数: 80
姓名:选手D 分数: 87
姓名:选手O 分数: 82
姓名:选手X 分数: 81
姓名:选手W 分数: 86
姓名:选手K 分数: 85
姓名:选手T 分数: 83
第2轮晋级名单
姓名:选手X 分数: 83
姓名:选手P 分数: 81
姓名:选手B 分数: 80
姓名:选手K 分数: 87
姓名:选手T 分数: 83
姓名:选手W 分数: 80
第3轮晋级名单
姓名:选手T 分数: 83
姓名:选手W 分数: 81
姓名:选手B 分数: 80