STL应用的经典案例 有24人参加演讲比赛,抽签分组,6人一组,两轮淘汰赛,一轮决赛,最后求出最后前三名,要求打印每一轮的参赛情况和比赛结果

 #include <iostream> 

#include <algorithm>
#include <map>
#include <string>
#include <vector>
#include <deque>
#include <functional>
#include <numeric>


using namespace std;


//参赛选手
class speaker
{
public:
string m_name;
int score[3];
};


//产生选手
void genespeaker(map<int,speaker> &mapspeaker,vector<int> &v)
{
string str="ABCDEFGHIGKLMNOPQRSTUVWXYZ";
random_shuffle(str.begin(),str.end());
for(int i=0;i<24;i++)
{
speaker tmp;
tmp.m_name="选手";
tmp.m_name=tmp.m_name+str[i];
mapspeaker.insert(pair<int,speaker>(100+i,tmp));
v.push_back(100+i);
}
}


//抽签
 void speech_random(vector<int> &v)
 {
random_shuffle(v.begin(),v.end());
 }


 //比赛
 void speech_contest(int index,vector<int> &v1,map<int,speaker> &mapspeaker,vector<int> &v2)
 {
multimap<int,int,greater<int>> multiGroup;  //存小组成员的分数和编号
int count=0;
for(vector<int>::iterator it=v1.begin();it!=v1.end();it++)

count++;
deque<int> dscore;
//打分
{
for(int i=0;i<10;i++)
{
int score=50+rand()%50;
dscore.push_back(score);
}
dscore.pop_back();
dscore.pop_front();
int scoresum=accumulate(dscore.begin(),dscore.end(),0);
int avgscore=scoresum/dscore.size();
mapspeaker[*it].score[index]=avgscore;
multiGroup.insert(pair<int,int>(avgscore,*it));
}


//分组
if(count%6 == 0)
{
cout<<"各小组比赛结果"<<endl;
for(multimap<int,int,greater<int>>::iterator mit=multiGroup.begin();
mit!=multiGroup.end();mit++)
{
cout<<mit->second<<"\t"<<mapspeaker[mit->second].m_name<<"\t"<<mit->first<<endl;
}


//晋级名单
while(multiGroup.size()>3)
{
multimap<int,int,greater<int>>::iterator it1=multiGroup.begin();
v2.push_back(it1->second);
multiGroup.erase(it1);
}
multiGroup.clear();
}
}
 }


 void  speech_print(int index,vector<int> &v2,map<int,speaker> &mapspeaker)
 {
cout<<endl;
for(vector<int>::iterator it=v2.begin();it!=v2.end();it++)
{
cout<<"恭喜"<<*it<<"\t"<<mapspeaker[*it].m_name<<"\t"<<mapspeaker[*it].score[index]<<"晋级"<<endl;
}


 }


int main()
{
   map<int,speaker> mapspeaker;       //存放参赛选手和其编号


   vector<int> v1;                    //第一轮参赛选手编号名单
   vector<int> v2;                    //第二轮参赛选手编号名单
   vector<int> v3;                    //决赛参赛选手编号名单
   vector<int> v4;                    //前三名选手编号名单


   //产生选手
   genespeaker(mapspeaker,v1);


   //第一轮  抽签  比赛  晋级名单
   cout<<"按任意键开始比赛1"<<endl;
   cin.get();
   speech_random(v1);
   speech_contest(0,v1,mapspeaker,v2);
   speech_print(0,v2,mapspeaker);


   //第二轮  抽签  比赛  晋级名单
   cout<<"按任意键开始比赛1"<<endl;
   cin.get();
   cin.get();
   speech_random(v2);
   speech_contest(1,v2,mapspeaker,v3);
   speech_print(1,v3,mapspeaker);


   //第三轮  抽签  比赛  晋级名单
   cout<<"按任意键开始比赛1"<<endl;
   cin.get();
   cin.get();
   speech_random(v3);
   speech_contest(2,v3,mapspeaker,v4);
   speech_print(2,v4,mapspeaker);


   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值