STL综合案例

1.某市举行一场演讲比赛( speech_contest ),共有24个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。
1)比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛;

2)第一轮分为4个小组,每组6个人。比如编号为: 100-123. 整体进行抽签(draw)后顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
3)第二轮分为2个小组,每组6人。比赛完毕,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
4)第三轮只剩下1组6个人,本轮为决赛,选出前三名。

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

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

需求分析:

  1. 产生选手 ( ABCDEFGHIJKLMNOPQRSTUVWX ) 姓名、得分;选手编号
  2. 第1轮 选手抽签 选手比赛 查看比赛结果
  3. 第2轮 选手抽签 选手比赛 查看比赛结果
  4. 第3轮 选手抽签 选手比赛 查看比赛结果
#define _CRT_SECURE_N0_WARNINGS
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
#include<deque>
#include<numeric>
#include<functional>
using namespace std;

class Speaker
{
public:
	string M_name;
	int score[3];
};

void createSpeaker(vector<int>&v,map<int,Speaker>&m)
{
	string nameSeed="ABCDEFGHIGKLMNOPQRSTUVWX";
	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.score[j]=0;
	}
	v.push_back(i+100);
	m.insert(make_pair(i+100,sp));
}
}

void speechDraw(vector<int>v)
{
	random_shuffle(v.begin(),v.end());
}

void speechContest(int index,vector<int>&v,map<int,Speaker>&m,vector<int>&v1)
{
	multimap<int,int,greater<int>>groupMap;  //key 分数  value 编号
	int num=0;
	for (vector<int>::iterator it=v.begin();it!=v.end();it++)
	{
		 num++;
		deque<int>d;
		for (int i=0;i<10;i++)
		{
			int score=rand()%41+60;
			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].score[index-1]=avg;

		//每6个人取前3名
		//用临时容器保存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].score[index-1]<<endl;
			}

			*/
			//取前三名
			int count=0;
			for (multimap<int,int,greater<int>>::iterator mit=groupMap.begin();mit!=groupMap.end(),count<3;mit++,count++)
			{
				v1.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.score[index-1]<<endl;
	}
	cout<<"晋级选手编号"<<endl;
	for (vector<int>::iterator it=v.begin();it!=v.end();it++)
	{
		cout<<*it<<endl;
	}
}
int main()
{
	//创建编号容器
	vector<int>v;

	//创建姓名成绩容器
	map<int,Speaker>m;

	//创建人员信息
	createSpeaker(v,m);

	//抽签
	speechDraw(v);

	vector<int>v1;   //存放进入下一轮比赛的编号
	//选手比赛
	speechContest(1,v,m,v1);

	//显示比赛结果
	showScore(1,v1,m);//轮数,选手编号,对应的选手

	//第二轮比赛
	speechDraw(v1);
	vector<int>v2;//存放进入下一轮比赛的编号
	speechContest(2,v1,m,v2);
	showScore(2,v2,m);

	//第三轮比赛
	speechDraw(v2);
	vector<int>v3;//存放进入下一轮比赛的编号
	speechContest(3,v2,m,v3);
	showScore(3,v3,m);
	
system("pause");
return EXIT_SUCCESS;
}

总结:
1)用vector容器存放编号,因为vector支持随机存取
2)用deque存放打分成绩,deque是双端开口的线性空间,所以可以实现去除最高分和最低分的操作
3)map容器可以同时拥有键值和实值,而且还不允许重复,可以用来存放选手姓名和比赛第n轮的成绩。
4)Multimap存放的键值可以重复,用来存放平均分。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值