STL综合题:歌唱比赛

某学校举行一场唱歌比赛,共有24个人参加,按参加顺序设置参赛号(参赛号为100至123)。
每个选手唱完一首歌之后,由10个评委分别打分。该选手的最终得分是去掉一个最高分和一个最低分,求得剩下的8个评分的平均分。
比赛共三轮,前两轮为淘汰赛,第三轮为决赛。选手的名次按得分降序排列,若得分一样,按参赛号升序排名。
第一轮分为4个小组,根据参赛号顺序依次划分,比如100-105为一组,106-111为第二组,依次类推,每组6个人,每人分别按参赛号顺序演唱。当小组演唱完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。

第二轮分为2个小组,每组6人,每个人分别按参赛号顺序演唱。当小组演唱完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。

第三轮只剩下6个人,本轮为决赛,不淘汰选手,本轮目的是赛出每个人的名次。该6人按参赛号顺序分别演唱。

请用STL解答以下问题:
1.请打印出所有选手的名字与参赛号,并以参赛号的升序排列。

2.请打印出第1轮和第2轮淘汰赛中,各小组选手的名字与选手得分,并以名次的顺序排列

3.请打印出第1轮淘汰赛中被淘汰的歌手的名字(不要求打印顺序)。

4.请打印出第2轮淘汰赛中被淘汰的歌手的分数,并以名次的降序排列。

数据存放分析:


选手和ID有映射关系,故选map。                                                            剩余选手不确定位置删除,故选list

                                         

小组内存放分数和ID的映射,由于分数可能相同,故选multimap

vector满足存放被淘汰选手的ID

分数排序,选multiset

singer.h(选手信息结构体)
-------------------------
#pragma once#include <string>
using namespace std;struct Singer
{string strName;        //名字int iLatestScore;   //最新得分
};
SingingCompetition.h
-------------------------
#pragma once#include "Singer.h"
#include <vector>
#include <map>
#include <list>
#include <deque>
#include <set>
#include <algorithm>
#include <numeric>
using namespace std;class CSingingCompetition
{
public:CSingingCompetition(void);virtual ~CSingingCompetition(void);//对外开放的成员方法
public://报名参加比赛void JoinCompetition();//第一轮淘汰赛void FirstKnockout();//第二轮淘汰赛void SecondKnockout();//决赛void Finals();//不对外开放的私有成员方法
private://生成歌手的分数void MakeScore(Singer &singer);//打印当前小组的分数void PrintGroupScore();//在当前小组中淘汰歌手void EraseInCurGroup();//在剩余歌手中删除歌手void EraseInRemainingID(list<int>::iterator it);//淘汰赛void Knockout();//私有成员变量
private:map<int, Singer> m_mapSinger;     //所有的参赛ID与歌手的映射集合。int:参赛ID,Singer:参加比赛的歌手。list<int> m_lstRemainingID;          //剩余歌手(没被淘汰的歌手)的参赛ID。int:剩余歌手的参赛ID。multimap<int, int, greater<int> > m_mltmapCurGroup;      //当前演唱小组的歌手分数与歌手参赛ID的映射集合。vector<int> m_vecIDBeEliminatedInFirstRound;            //第一轮淘汰赛中被淘汰的歌手参赛的集合。int: 歌手的参赛号。multiset<int> m_mltsetScoreBeEliminatedInSecondRound;    //第二轮淘汰赛中被淘汰的歌手分数的集合。int: 歌手的分数。int m_iRound;       //第几轮比赛,值为1:第一轮;值为2:第二轮;值为3:第三轮。
};
SingingCompetition.cpp
-------------------------
#include "StdAfx.h"
#include "SingingCompetition.h"CSingingCompetition::CSingingCompetition(void)
{//还没开始比赛,比赛轮数设置为0m_iRound = 0;//设置随机种子srand ( (unsigned)time ( 0 ) );
}CSingingCompetition::~CSingingCompetition(void)
{
}//报名参加比赛
void CSingingCompetition::JoinCompetition()
{if (m_iRound == 0){string strNameBaseSource("ABCDEFGHIJKLMNOPQRSTUVWXYZ");  //名字组成元素的来源//随机排序名字组成元素的来源random_shuffle(strNameBaseSource.begin(), strNameBaseSource.end());for (int i=0; i<24; ++i){//获取参加比赛的歌手名字string strExt(1,strNameBaseSource[i]);//构造歌手对象Singer singer;singer.iLatestScore = 0;singer.strName = "选手";singer.strName += strExt;//录入参加比赛的歌手m_mapSinger.insert(pair<int, Singer>(i+100, singer));m_lstRemainingID.push_back(i+100);}//打印参加比赛的歌手名字与参赛号TRACE("*******************************************************\n");TRACE("参加比赛的歌手名字与参赛号:\n");for (map<int,Singer>::iterator it=m_mapSinger.begin(); it!=m_mapSinger.end(); ++it){TRACE("ID:%d, %s\n",it->first,  it->second.strName.c_str());}TRACE("\n");}
}//第一轮淘汰赛
void CSingingCompetition::FirstKnockout()
{if (m_iRound == 0){m_iRound = 1;//进行淘汰赛Knockout();TRACE("第%d轮淘汰赛中被淘汰的歌手的名字:\n", m_iRound);for (vector<int>::iterator it=m_vecIDBeEliminatedInFirstRound.begin(); it!=m_vecIDBeEliminatedInFirstRound.end(); ++it){TRACE("%s ", m_mapSinger[*it].strName.c_str());}TRACE("\n");TRACE("\n");}
}//第二轮淘汰赛
void CSingingCompetition::SecondKnockout()
{if (m_iRound == 1){m_iRound = 2;//进行淘汰赛Knockout();TRACE("第%d轮淘汰赛中被淘汰的歌手的分数:\n", m_iRound);for (multiset<int>::iterator it=m_mltsetScoreBeEliminatedInSecondRound.begin(); it!=m_mltsetScoreBeEliminatedInSecondRound.end(); ++it){TRACE("%d ", *it);}TRACE("\n");TRACE("\n");}
}//决赛
void CSingingCompetition::Finals()
{if (m_iRound == 2){m_iRound = 3;//第三轮决赛for (list<int>::iterator it=m_lstRemainingID.begin(); it!=m_lstRemainingID.end(); ++it){//生成歌手的分数MakeScore(m_mapSinger[*it]);//记录当前小组歌手的得分情况,按分数降序排列m_mltmapCurGroup.insert(pair<int,int>(m_mapSinger[*it].iLatestScore, *it));}//打印小组决赛情况TRACE("*************小组决赛情况:*************\n");for (multimap<int,int, greater<int> >::iterator it=m_mltmapCurGroup.begin(); it!=m_mltmapCurGroup.end(); ++it){TRACE("%s的得分:%d\n", m_mapSinger[it->second].strName.c_str() ,it->first);}TRACE("\n");//清除所有的数据m_mapSinger.clear();m_lstRemainingID.clear();m_vecIDBeEliminatedInFirstRound.clear();m_mltsetScoreBeEliminatedInSecondRound.clear();m_mltmapCurGroup.clear();m_iRound = 0;}
}//生成歌手的分数
void CSingingCompetition::MakeScore(Singer &singer)
{deque<int> deqScore;//十个评委分别对歌手打分for (int i=0; i<10; ++i){int iScore = 60 + rand()%40;deqScore.push_back(iScore);}//为十个评委的打分排序sort(deqScore.begin(), deqScore.end());//去掉一个最高分,去掉一个最低分deqScore.pop_front();deqScore.pop_back();//求八个评委打分的总和int iScoreSum = accumulate(deqScore.begin(), deqScore.end(), 0);//求八个评委打分的平均分int iScoreAverage = (int)(iScoreSum/deqScore.size());//给歌手设置得分singer.iLatestScore = iScoreAverage;
}//打印当前小组的分数
void CSingingCompetition::PrintGroupScore()
{TRACE("小组得分情况:\n");for (multimap<int,int, greater<int> >::iterator it=m_mltmapCurGroup.begin(); it!=m_mltmapCurGroup.end(); ++it){TRACE("%s的得分:%d\n", m_mapSinger[it->second].strName.c_str() ,it->first);}TRACE("\n");
}//在当前小组中淘汰歌手
void CSingingCompetition::EraseInCurGroup()
{int iSingerLastIndexInGroup = 0;      //组内歌手的倒数索引while(iSingerLastIndexInGroup<3){//获取当前演唱小组的最后一个元素的迭代器multimap<int,int,greater<int> >::iterator it=m_mltmapCurGroup.end();--it;++iSingerLastIndexInGroup;if (m_iRound == 1){//记录第一轮淘汰赛中被淘汰的歌手的参赛号m_vecIDBeEliminatedInFirstRound.push_back(it->second);}else if (m_iRound == 2){//记录第二轮淘汰赛中被淘汰的歌手的分数m_mltsetScoreBeEliminatedInSecondRound.insert(m_mapSinger[it->second].iLatestScore);}//从当前演唱小组的集合容器中删除最后一个元素m_mltmapCurGroup.erase(it);}
}//在剩余歌手中删除歌手
void CSingingCompetition::EraseInRemainingID(list<int>::iterator it)
{int iSingerReverseIndexInGroup = 0;       //逆向遍历的索引while(iSingerReverseIndexInGroup<6){//查找逆向遍历迭代器所指的参赛ID所对应歌手的{分数,参赛ID}是否在当前演唱小组中multimap<int,int,greater<int> >::iterator itMltmapScoreToID = find(m_mltmapCurGroup.begin(),m_mltmapCurGroup.end(), multimap<int,int,greater<int> >::value_type(m_mapSinger[*it].iLatestScore, *it));if (itMltmapScoreToID == m_mltmapCurGroup.end()){//没找到,从剩余歌手集合中删除该歌手的参赛号it = m_lstRemainingID.erase(it);}//逆向遍历的索引自增++iSingerReverseIndexInGroup;//防止对容器的begin()迭代器进行--操作。if (it != m_lstRemainingID.begin()){--it;}}//清除该组的比赛记录存储,以便下一组比赛记录的存储m_mltmapCurGroup.clear();
}//淘汰赛
void CSingingCompetition::Knockout()
{TRACE("*************第%d轮淘汰赛:*************\n", m_iRound);int iSingerIndex = 0;        //第几个歌手正在演唱,1代表第一个歌手,2代表第二个歌手。。。for (list<int>::iterator it=m_lstRemainingID.begin(); it!=m_lstRemainingID.end(); ){++iSingerIndex;//生成歌手的分数MakeScore(m_mapSinger[*it]);//记录当前演唱小组歌手的得分情况,按分数降序排列m_mltmapCurGroup.insert(pair<int,int>(m_mapSinger[*it].iLatestScore, *it));if (iSingerIndex%6 == 0){//小组演唱完毕,打印小组得分情况PrintGroupScore();//在当前小组中淘汰歌手EraseInCurGroup();//在剩余歌手中删除歌手EraseInRemainingID(it++);  //不可用++it代替,因为要转入自增之前的迭代器}else{++it;}}
}

【学习笔记】《STL使用入门教程》第七讲:STL的综合应用相关推荐

  1. php laravel 入门教程,PHP语言菜鸟笔记,laravel 入门教程

    本文主要向大家介绍了PHP语言菜鸟笔记,laravel 入门教程,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 安装 Laravel: 查看laravel包: composer sea ...

  2. 【学习笔记】Mininet 入门

    [学习笔记]Mininet入门实战 课程介绍 Mininet是由一些虚拟的终端节点.交换机.路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美. Mininet可以很 ...

  3. Timo学习笔记 :Python基础教程(第三版)第四章 当索引行不通时

    第四章 当索引行不通时 Timo学习笔记 :Python基础教程(第三版)第三章 使用字符串 这是word编辑的最后一章笔记,第五章开始将直接用这个模板记录. 本章笔记很少,也很简单.很多方法可以到要 ...

  4. Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用

    Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用 按照官网教程学习使用组件,并且重点把容器组件的应用进行了练习. 1.官网关于组件的介绍 组件是视图层的基本组成单元,是一个单独且可复用的 ...

  5. TurboLinux入门教程:第七课TurboLinux简介(转)

    TurboLinux入门教程:第七课TurboLinux简介(转) 第七课 TurboLinux简介 TurboLinux是拓林思公司最近发行的linux版本,已在日本和中国取得了巨大的成功,在美国也 ...

  6. 【Python学习笔记】cs231nPython Numpy教程

    [Python学习笔记]cs231nPython Numpy教程 回顾经典教程cs231n,完成assignments觉得很困难,感觉自己python基础语法掌握的不是很熟,就顺藤摸瓜找了cs231n ...

  7. Hadoop学习笔记(1) ——菜鸟入门

     Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...

  8. WPF入门教程(七)---依赖属性(3)(转)

    WPF入门教程(七)---依赖属性(3) 2018年08月24日 08:33:43 weixin_38029882 阅读数:50 四. 只读依赖属性 在以前在对于非WPF的功能来说,对于类的属性的封装 ...

  9. wandb(wb)(weights and biases): 深度学习轻量级可视化工具入门教程

    参考文章:wandb: 深度学习轻量级可视化工具入门教程 这wandb有点蛋疼啊,说登录https://wandb.ai/authorize?signup=true获取API KEY,但貌似要梯子才能 ...

  10. wandb: 深度学习轻量级可视化工具入门教程

    本文,就来给大家介绍一款新型的机器学习可视化工具,能够让人工智能研发过程变得更加简单明了. wandb: 深度学习轻量级可视化工具入门教程 引言 wandb 验证数据可视化 自然语言处理 重要工具 极 ...

最新文章

  1. Swift与Objective-C API交互
  2. [AHOI2014/JSOI2014]支线剧情
  3. @property与@synthesize的差别
  4. 医疗卫生信息化 医学信息 医院管理 医疗信息化 资源下载
  5. 百度SEO进云jys系统应用开发框架
  6. javaweb基础----使用ajax校验用户名是否重复
  7. python定义函数的组成部分有_Python学习笔记之函数的定义和作用域实例详解
  8. 几何画板椭圆九种画法_椭圆的标准方程课堂(几何画板动画版).ppt
  9. Tecplot 安装记录
  10. 蓝桥杯真题-单词分析
  11. html5拾色器功能,html5 学习简单的拾色器
  12. VS2019怎么运行cpp文件
  13. 黑帽SEO研究之js快照劫持代码分析
  14. FastText学习笔记
  15. [希腊神话--英语]另类重看英语词汇---序言
  16. OpenCV 5种图像滤波辨析:方框、均值、高斯、中值、双边
  17. java计算机毕业设计游泳馆信息管理系统源程序+mysql+系统+lw文档+远程调试
  18. python写金字塔(数字金字塔)
  19. 怎么点亮段码屏_段码LCD液晶屏参考程序
  20. [附源码]Python计算机毕业设计_旅游系统

热门文章

  1. 运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现...
  2. 基于Ambari的大数据平台搭建
  3. 浙里办 前端上传部署报错
  4. c语言实型常量除以整形常量,c语言中的整型常量和实型常量.docx
  5. 逻辑题 | 140克盐如何3次分成50克、90克?
  6. 跨境电商独立站的玩法介绍-扬帆际海
  7. android视频压分辨率压缩,视频的文件格式、压缩格式、码率、分辨率
  8. pycharm技巧-win10给pycharm设置全局字符串搜索快捷键
  9. Pycharm 设置在Run 窗口运行
  10. IT族室内锻炼身体的小妙招