STL-综合案例

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

  1. 产生选手 ( ABCDEFGHIJKLMNOPQRSTUVWX ) 姓名、得分;
    选手编号第1轮 选手抽签 选手比赛 查看比赛结果第2轮 选手抽签
    选手比赛 查看比赛结果第3轮 选手抽签 选手比赛 查看比赛
#include <iostream>
#include<string>
#include<vector>
#include<map>
#include<unistd.h>
#include<algorithm>
#include<numeric>
#include <cmath>
using namespace std;
class Speaker
{
public:
    string name;
    int score[3];
public:
    Speaker(){;}
    Speaker(string name)
    {
        this->name=name;
        memset(score,0,sizeof(score));
    }
};
void createSpeaker(vector<int>&v,map<int,Speaker>&m)
{
    string tmp="ABCDEFGHIJKLMNOPQRSTUVWX";
    for(int i=0;i<24;i++)
    {
        //存放选手编号
        v.push_back(100+i);
        string name="选手";
        name+=tmp[i];
        //<编号,选手>
        m.insert(make_pair(i+100,Speaker(name)));    //【m,v的编号是一致的】
    }
}
#include<time.h>
#include<deque>

void speech_contest(int index,vector<int>&v,map<int,Speaker>&m,vector<int>&v1);

void printSpeechResault(int index,vector<int>&v,map<int,Speaker>&m,vector<int>&v1);
int main()
{
    vector<int> v;//选手的编号
    map<int,Speaker> m;//<编号,选手>

    createSpeaker(v,m);
    srand(time(NULL));
    random_shuffle(v.begin(),v.end());//打乱选手编号

    vector<int> v1;//晋级容器
    speech_contest(1,v,m,v1);
    printSpeechResault(1,v,m,v1);

    random_shuffle(v1.begin(),v1.end());
    vector<int>v2;
    speech_contest(2,v1,m,v2);
    printSpeechResault(2,v1,m,v2);

    random_shuffle(v2.begin(),v2.end());
    vector<int>v3;
    speech_contest(3,v2,m,v3);
    printSpeechResault(3,v2,m,v3);

    return 0;
}

void speech_contest(int index, vector<int> &v, map<int, Speaker> &m, vector<int> &v1)
{
     int count=0;
     multimap<int,int,greater<int> >m2;//设计一个<分数,编号>的map容器 存放每一组的《分数,编号》
     for(vector<int>::iterator it=v.begin();it!=v.end();it++)//vectot里的选手逐个上场
     {
         count++;
         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_front();
         d.pop_back();
         int sum=accumulate(d.begin(),d.end(),0);
         int avg=sum/d.size();
         m[*it].score[index-1]=avg;//第index-1回合选手的分数
         m2.insert(make_pair(avg,*it));
         if(count%6==0)//【算法思想】
         {
             int i=0;
             for(multimap<int,int,greater<int> >::iterator mit=m2.begin();mit!=m2.end()&i<3;mit++,i++)
             {
                 v1.push_back((*mit).second);
             }
             m2.clear();
         }
     }
}
void printSpeechResault(int index, vector<int> &v, map<int, Speaker> &m, vector<int> &v1)
{
    cout<<"第"<<index<<"轮比赛成绩如下"<<endl;
    int count=0;
    int n=0;
    vector<int>::iterator mit= v1.begin();//v1是晋级容器
    for(vector<int>::iterator it=v.begin();it!=v.end();it++)//逐个选手遍历
    {
        if(count%6==0)
        {
            n=count/6+1;
           cout<<"第"<<n<<"组的成绩如下:"<<endl;
        }
        count++;

        cout<<"姓名:"<<m[*it].name<<",得分"<<m[*it].score[index-1]<<endl;
        if(count%6==0)
        {
            cout<<"第"<<n<<"组的晋级名单如下:"<<endl;
            for(int i=0;i<3;i++,mit++)
            {
                cout<<"姓名:"<<m[*mit].name<<",得分"<<m[*mit].score[index-1]<<endl;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值