十、STL综合案例——学校演讲比赛

1.比赛介绍

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

  • 第一轮分为4个小组,每组6人。比如100-105一组,106-111二组,一次类推
  • 没人分别按照抽签(draw)顺序演讲。当小组演讲完后,淘汰组内排名最后的三名宣说,然后进行下一个小组的比赛
  • 第二轮分为2个小组,每组6人。比赛完毕,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
  • 第三轮只剩下6个人,本轮为决赛,选出前三名

3) 比赛评分:10个评委打分,去除最低、最高分,求平均分

  • 每个选手演讲完由10名评委打分。该选手的最终得分是去掉一个最高分和一个最低分
  • 选手的名字按得分降序排列,若得分一样,按参赛号升序排名

4) 用STL编程,求解这个问题

  • 请打印出所有选手的名字和参赛号,并以参赛号的升序排列
  • 打印每一轮比赛后,小组比赛成绩和小组晋级名单
  • 打印决赛前三名,选手名称、成绩

2.需求分析

//产生选手(ABCDEFGHIJKLMNOPQRSTUVWXYZ) 姓名、得分;选手编号
//第一轮 选手抽签 选手比赛 查看比赛结果
//第二轮 选手抽签 选手比赛 查看比赛结果
//第三轮 选手抽签 选手比赛 查看比赛结果

3. 实现思路

需要把选手信息,选手得分信息、选手比赛抽签信息、选手的晋级信息保存到容器中,需要涉及各个容器的类型。(相当于信息的数据库E-R图设计)
选手可以设计一个 Speaker(姓名和得分)
所有选手编号和选手信息,可以放在容器内:map<int,Speaker>
所有选手的编号信息,可以放在容器:vector<int> v1
第1轮晋级名单,可以放在容器vector<int> v2
第2轮晋级名单,可以放在容器vector<int> v3
第3轮晋级名单,可以放在容器vector<int> v4

每个小组的比赛得分信息,按照从小到大排序放在
multimap<成绩,编号,greater<int>>multimapGroup
也就是
multimap<int,int,greater<int>>multimapGroup
每个选手的得分,可以放在容器deque<int>dscore;方便去除最低最高分

4.搭建框架

#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;

//定义选手类
class Speaker{
public:
    string name;
    int score[3];//保存3轮最终得分
};

//创建选手
void Create_Speaker(map<int,Speaker> &mapSpeaker,vector<int> &v1){
    
}

//选手抽签
int Random_SpeakerID(vector<int> &v1){
   
}


//选手比赛(第几轮,选手编号,比赛得分保存,晋级编号保存)
void Match_Speaker(int index,vector<int> &v1,map<int,Speaker> &mapSpeaker,vector<int> &v2){

}

//查看比赛结果(第一轮,结果保存容器,对应名字)   其实就是第一轮结果保存在了v2中,再利用mapSpeaker看名字
void Show_Match_Result(int index,vector<int> &v2,map<int,Speaker> &mapSpeaker){

}

int main(){

 
   map<int,Speaker> mapSpeaker;//保存选手信息 根据编号

   vector<int> v1;//保存第一轮参赛的编号
   vector<int> v2;//第一轮比赛的晋级编号(第二轮比赛编号)
   vector<int> v3;//第二轮晋级编号(第三名比赛编号)
   vector<int> v4;//最终最终的前三名编号

   //创建选手 24 名
   Create_Speaker(mapSpeaker,v1);

   //----------------------------第一轮比赛

   //选手抽签
   Random_SpeakerID(v1);//相当于把容器内的编号打乱就好了

   //选手比赛 (第一轮,选手,比赛得分保存,编号保存)
   Match_Speaker(1,v1,mapSpeaker,v2);

   //查看比赛结果(第一轮,结果保存容器,对应名字)   其实就是第一轮结果保存在了v2中,再利用mapSpeaker看名字
   Show_Match_Result(1,v2,mapSpeaker);


   //----------------------------第二轮比赛
   Random_SpeakerID(v2);//选手抽签
   Match_Speaker(2,v2,mapSpeaker,v3);//选手比赛
   Show_Match_Result(2,v3,mapSpeaker); //查看比赛结果


   //----------------------------第三轮比赛
   Random_SpeakerID(v3);//选手抽签
   Match_Speaker(3,v3,mapSpeaker,v4);//选手比赛
   Show_Match_Result(3,v4,mapSpeaker); //查看比赛结果

   return 0;
}

5.完整代码

#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <deque>
#include <numeric>
#include <functional>
using namespace std;

//定义选手类
class Speaker{
public:
    string name;
    int score[3];//保存3轮最终得分
};

//创建选手
void Create_Speaker(map<int,Speaker> &mapSpeaker,vector<int> &v1){
    string nameseed = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for(int i = 0; i < 24;i++){

        //创建选手对象
        Speaker speaker;
        speaker.name = "选手";
        speaker.name += nameseed[i];

        speaker.score[0] = 0;
        speaker.score[1] = 0;
        speaker.score[2] = 0;


        //创建选手唯一的参赛编号
        int SpeakerID = 100 + i;
        mapSpeaker.insert(make_pair<int,Speaker>(SpeakerID,speaker));//保存选手信息
        v1.push_back(SpeakerID);
    }
}

//选手抽签
int Random_SpeakerID(vector<int> &v1){
   random_shuffle(v1.begin(),v1.end());//在<algorithm>中
}

//选手比赛(第几轮,选手编号,比赛得分保存,晋级编号保存)
void Match_Speaker(int index,vector<int> &v1,map<int,Speaker> &mapSpeaker,vector<int> &v2){
    multimap<int,int,greater<int>> mapGroup;//分数做key,id做value 就可以排序了
    int indexTemp = 0;
    int indexGroup = 0;//记录哪一组
    for(vector<int>::iterator it = v1.begin();it != v1.end();it++){

        indexTemp++;
        deque<int> dscore;//保存评委10次得分
        for (int i = 0; i < 10; ++i){
            int score = 50 + rand() % 50;
            dscore.push_back(score);
        }

        //排序
        sort(dscore.begin(),dscore.end());//从小到大

        //去除最高分
        dscore.pop_back();//去除最高分
        dscore.pop_front();//去除最低分

        //求平均分 先累加
        int totalscore = accumulate(dscore.begin(),dscore.end(),0);//在numeric中
        int scoreavg = totalscore/dscore.size();

        mapSpeaker[*it].score[index-1] = scoreavg;//*it就是编号 index-1才是分数
        
        mapGroup.insert(make_pair<int,int>(scoreavg,*it));//保存分组信息

        if (indexTemp % 6 == 0)
        {
            indexGroup++;
            int highIndex = 0;
            printf("第%d轮比赛成绩第%d组比赛成绩:\n",index,indexGroup);
            for(multimap<int,int,greater<int>>::iterator it2 = mapGroup.begin();it2 != mapGroup.end();it2++){
                  highIndex++;
                  if (highIndex <= 3)
                  {
                    v2.push_back(it2->second);//保存前三名
                  }
                  cout<<"姓名:"<<mapSpeaker[it2->second].name<<" 分数:"<<mapSpeaker[it2->second].score[index-1]<<endl;
            }

            mapGroup.clear();//清空mapGroup
        }

    }
}

//查看比赛结果(第一轮,结果保存容器,对应名字)   其实就是第一轮结果保存在了v2中,再利用mapSpeaker看名字
void Show_Match_Result(int index,vector<int> &v2,map<int,Speaker> &mapSpeaker){

   printf("第%d轮比赛晋级名单\n",index);
   for(vector<int>::iterator it = v2.begin();it != v2.end();it++){
       cout<<"姓名:"<<mapSpeaker[*it].name<<" 分数"<<mapSpeaker[*it].score[index-1]<<endl;
   }
}

int main(){

 
   map<int,Speaker> mapSpeaker;//保存选手信息 根据编号

   vector<int> v1;//保存第一轮参赛的编号
   vector<int> v2;//第一轮比赛的晋级编号(第二轮比赛编号)
   vector<int> v3;//第二轮晋级编号(第三名比赛编号)
   vector<int> v4;//最终最终的前三名编号

   //创建选手 24 名
   Create_Speaker(mapSpeaker,v1);

   //----------------------------第一轮比赛

   //选手抽签
   Random_SpeakerID(v1);//相当于把容器内的编号打乱就好了

   //选手比赛 (第一轮,选手,比赛得分保存,编号保存)
   Match_Speaker(1,v1,mapSpeaker,v2);

   //查看比赛结果(第一轮,结果保存容器,对应名字)   其实就是第一轮结果保存在了v2中,再利用mapSpeaker看名字
   Show_Match_Result(1,v2,mapSpeaker);


   //----------------------------第二轮比赛
   Random_SpeakerID(v2);//选手抽签
   Match_Speaker(2,v2,mapSpeaker,v3);//选手比赛
   Show_Match_Result(2,v3,mapSpeaker); //查看比赛结果


   //----------------------------第三轮比赛
   Random_SpeakerID(v3);//选手抽签
   Match_Speaker(3,v3,mapSpeaker,v4);//选手比赛
   Show_Match_Result(3,v4,mapSpeaker); //查看比赛结果

   return 0;
}
1.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容

  • 原创申明:本文参加“423简书故事节”,本人承诺文章内容为原创。 【1】 公元2137年。 这天是星期天,按照天气...
    死宅文化研究所阅读 358评论 0 3
  • 标签(空格分隔): STL 运用STL,可以充分利用该库的设计,让我为简单而直接的问题设计出简单而直接的解决方案,...
    认真学计算机阅读 1,477评论 0 10
  • 其实我的生活最近没有大起大落,平和的心态像水一样温和,新的开始也只是自己期望自己,可以真正的开始新的生活。 突然发...
    小一凡的日记本阅读 457评论 1 1
  • 舍不得还是会舍不得,时间越久心里怕是会更难受的。我不能一辈子...一辈子都这样过,我也希望能有个人永远把我当...
    不知道是我阅读 211评论 0 1
  • 区别 函数上当前点对应的梯度方向是增大最快的方向,反方向是减小最快的方向 梯度上升 要计算的是函数的极大值,如最大...
    yxwithu阅读 2,863评论 0 2