c++中STL实现演讲比赛流程

演讲比赛流程

1)某市举行一场演讲比赛,共有 24 个人参加,按参加顺序设置参赛号。比赛共三轮,前两 轮为淘汰赛,第三轮为决赛。
2)比赛方式:分组比赛

  1. 第一轮分为 4 个小组,根据参赛号顺序依次划分,比如 100-105 为一组,106-111 为第 二组,依次类推,每组 6 个人,每人分别按参赛号顺序演讲。当小组演讲完后,淘汰组内排 名最后的三个选手,然后继续下一个小组的比赛。
  2. 第二轮分为 2 个小组,每组 6 人,每个人分别按参赛号顺序演讲。当小组完后,淘汰组 内排名最后的三个选手,然后继续下一个小组的比赛。
  3. 第三轮只剩下 6 个人,本轮为决赛,选出前三名。

3). 选手每次要随机分组,进行比赛。

4)比赛评分:10 个评委打分,去除最低、最高分,求平均分 每个选手演讲完由 10 个评委分别打分。该选手的最终得分是去掉一个最高分和一个最 低分,求得剩下的 8 个成绩的平均分。选手的名次按得分降序排列,若得分一样,按参赛号 升序排名。

需解决问题

1) 请打印出所有选手的名字与参赛号,并以参赛号的升序排列。
2) 打印每一轮比赛前,分组情况
3) 打印每一轮比赛后,小组晋级名单
4) 打印决赛前三名,选手名称、成绩。

#include<iostream>
#include<vector>
#include<map>
using namespace std;
#include<string>
#include<algorithm>
#include<deque>
#include<numeric>
#include<functional>
class Speaker
{
public:

	string m_Name;//姓名
	int m_Score[3];//得分数组

};

//创建选手函数
void createSpeaker(vector<int>&v, map<int,Speaker>&m)
{
	string nameSeed = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	//创建选手
	for (int i = 0; i < 24; ++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());
}

//比赛函数
// 1 第几轮得分  2 v1比赛选手编号,3 m是选手编号和具体选手   4 v2晋级选手编号容器
void speechContest(int index,vector<int>&v1, map<int, Speaker>&m, vector<int>&v2)
{
	//临时容器
	multimap<int, int, greater<int>>groupMap;//分数 编号
	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个人取前三名 晋级 进入v2容器
		//临时容器保存6个人,晋级完后清空,再进入6个人
		//临时容器,存入数据
		groupMap.insert(make_pair(avg, *it));
		if (num % 6 == 0)  //够6个人进入
		{
			/*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()
{

	vector<int>v1;//放选手编号
	map<int, Speaker> m ;//存放选手编号,和队医你个的具体选手
	//创建选手
	createSpeaker(v1, m);

	//抽签
	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(2, v4, m);

	/*for (map<int,Speaker>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "编号:" << it->first << "姓名:" << it->second.m_Name << endl;
	}*/

	system("pause");
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值