c++之综合案例1(学校演讲比赛)

学校演讲比赛介绍:
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 分数: 832轮晋级名单
姓名:选手X 分数: 83
姓名:选手P 分数: 81
姓名:选手B 分数: 80
姓名:选手K 分数: 87
姓名:选手T 分数: 83
姓名:选手W 分数: 803轮晋级名单
姓名:选手T 分数: 83
姓名:选手W 分数: 81
姓名:选手B 分数: 80
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值