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

来源:互联网 发布:知豆能不能上高速 编辑:程序博客网 时间:2024/04/30 13:15
#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;
}
阅读全文
0 0
原创粉丝点击