88.STL.exe

某市举行一场演讲比赛( speech_contest ),共有24个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。
比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛;
第一轮分为4个小组,每组6个人。比如编号为: 100-123.  整体进行抽签(draw)后顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
第二轮分为2个小组,每组6人。比赛完毕,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
第三轮只剩下1组6个人,本轮为决赛,选出前三名。
比赛评分:10个评委打分,去除最低、最高分,求平均分每个选手演讲完由10个评委分别打分。该选手的最终得分是去掉一个最高分和一个最低分,求得剩下的8个成绩的平均分。选手的名次按得分降序排列。

用STL编程,求解这个问题
1)	请打印出所有选手的名字与参赛号,并以参赛号的升序排列。
2)	打印每一轮比赛后,小组比赛成绩和小组晋级名单

需求分析:
    1) 产生选手 ( ABCDEFGHIJKLMNOPQRSTUVWX ) 姓名、得分;选手编号
    2) 第1轮    选手抽签 选手比赛 查看比赛结果 
    3) 第2轮    选手抽签 选手比赛 查看比赛结果
    4) 第3轮    选手抽签 选手比赛 查看比赛结果
实现思路:
    需要把选手信息、选手得分信息、选手比赛抽签信息、选手的晋级信息保存在容器中,需要涉及到各个容器的选型。
    选手可以设计一个类Speaker(姓名和得分)
    所有选手的编号可以单独放在一个vector容器中,做抽签用
    所有选手编号和选手信息,可以放在容器内:map<int, Speaker>

map<int,Speaker>:[KEY, VALUE]
		          [编号, 选手]
{
	{101, Speaker101},
	{102, Speaker102},
	{103, Speaker103},
	…
}

所有选手的编号名单,可以放在容器:vecter<int> v1中

vector<int> v1 :{101, 102, 103, 104 ……}  //所有参赛选手的编号

第1轮晋级编号名单,可以放在容器vecter<int> v2中

vector<int> v2 :{104, 107, 110, 120 ……}   //第一轮比赛晋级的选手编号

第2轮晋级编号名单,可以放在容器vecter<int> v3中

vector<int> v3 :{110, 107, 111, 124 ……}    //第二轮比赛晋级的选手编号

第3轮前三名名单,可以放在容器vecter<int> v4中

vector<int> v4 :{111, 107, 124} 	//第三轮比赛晋级的选手编号

每个小组的比赛得分信息,按照从大到小的顺序放在multimap<成绩, 编号, greater<int>>中

multimap<int,int,greater<int>>:[KEY, VALUE]
		                 [分数, 选手编号]
{
	{96, 101},
	{83, 102},
	{83, 102},
	{80, 103},
	…
}

每个选手的得分,可以放在容器deque<int> dscore; 方便去除最低最高分.

deque<int> dscore : {61, 68, 78, 84, 90 ……}  //10个评委对一位选手打出的成绩

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <deque>
#include <numeric>
#include <functional>
#include <ctime>
/*
1) 产生选手 ( ABCDEFGHIJKLMNOPQRSTUVWX ) 姓名、得分;选手编号

2) 第1轮	选手抽签 选手比赛 查看比赛结果
3) 第2轮	选手抽签 选手比赛 查看比赛结果
4) 第3轮	选手抽签 选手比赛 查看比赛结果
*/
class Speaker
{
public:

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


void createSpeaker(vector<int>&v, map<int, Speaker>&m)
{
	string nameSeed = "ABCDEFGHIJKLMNOPQRSTUVWX";
	for (int i = 0; i < nameSeed.size(); 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 第几轮,score有3个,表示有三轮   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; // key  分数  value  编号  
	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容器中,index表示数组的第几个元素
		m[*it].m_Score[index - 1] = avg;

		//每6个人  取前三名 晋级
		//临时容器 保存6个人
		//临时容器 存入数据
		groupMap.insert(make_pair(avg, *it));

		if (num % 6 == 0)
		{
			/*	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(){

	//随机数种子
	srand((unsigned int)time(NULL));

	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(3, 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 EXIT_SUCCESS;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值