问题
综合案例:演讲比赛
某市举行一场演讲比赛,共有24个人参加,比赛共三轮,前两轮为淘汰赛,第三轮为决赛。
比赛方式:
分组比赛,每组6人;选手每次要随机分组,进行比赛;
第一轮分为4个小组,每组6人。比如编号为100-123,整体进行抽签后顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,
然后继续下一个小组的比赛。(最终剩12人)
第二轮分为2个小组,每组6人。比赛完毕后,淘汰组内排名最后的三个选手,然后继续下一轮比赛。(最终剩6人)
第三轮只剩下一组6个人,选出前三名。
比赛评分:
10个评委打分,去掉最低、最高分,求平均分。
选手的名次按得分降序排列。
求解:1)打印出所有选手的名字和参赛号,并以参赛号升序排列;
2)打印每一轮比赛后,小组比赛成绩和小组晋级名单;
思路
选手信息:名字、得分----->Speaker类
对编号进行抽签后顺序演讲--->vector v<编号>;打乱顺序---->random_shuffle()
需要建立信息和编号关联--->map<编号,Speaker>
第一轮:
每6个人,先赋分保存到临时map<成绩,编号>中,设定greater默认降序排序
取前三个晋级编号保存到vector v1中,然后清空临时map;
按照v中的编号从map中找出对应选手和成绩作为成绩表、按照v1从map中找出对应成员信息作为参赛信息;
第二轮、第三轮操作与第一轮相同,只不过需要创建v2、v3。
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
#include<time.h>
#include<deque>
#include<numeric>
using namespace std;
class Speaker {
public:
string name;
int score[3];
public:
Speaker() {
}
Speaker(string name) {
this->name = name;
memset(this->score, 0, sizeof(this->score));
}
};
void createSpeaker(vector<int>& v, map<int, Speaker>& m) {
string tmp = "ABCDEFGHIJKLMNOPQRSTUVWX";
for (int i = 0; i < 24; i++) {
v.push_back(i+100);
string name = (string)"选手" + tmp[i];
m.insert(make_pair(i+100, Speaker(name)));
}
}
void speech_contest(int round, vector<int>& v, map<int, Speaker>& m, vector<int>& v1) {
multimap<int, int, greater<int>> m_numAndScore;
int count = 0;
for (vector<int>::iterator v_it = v.begin(); v_it != v.end(); v_it++) {
deque<int> d_score;
for (int i = 0; i < 10; i++) {
int tmp_score = rand() % 100;
d_score.push_back(tmp_score);
}
sort(d_score.begin(), d_score.end());
d_score.pop_back();
d_score.pop_front();
int sum = accumulate(d_score.begin(), d_score.end(), 0);
int avg = sum / d_score.size();
m[*v_it].score[round - 1] = avg;
m_numAndScore.insert(make_pair(avg, *v_it));
count++;
if (count == 6) {
int rank = 1;
for (multimap<int, int, greater<int>>::iterator m_it = m_numAndScore.begin(); rank != 4; m_it++ ,rank++) {
v1.push_back((*m_it).second);
}
count = 0;
m_numAndScore.clear();
}
}
}
void printSpeechResault(int round, vector<int>& v, map<int, Speaker>& m, vector<int>& v1) {
cout << "第" << round << "轮名次如下:" << endl;
vector<int>::iterator v1_it = v1.begin();
int count = 0;
int n = 0;
for (vector<int>::iterator v_it = v.begin(); v_it != v.end(); v_it++) {
if (count % 6 == 0) {
n = count / 6 + 1;
cout << "第" << n << "组选手成绩:" << endl;
}
cout << "姓名:" << m[*v_it].name << " 成绩:" << m[*v_it].score[round-1] << endl;
count++;
if (count % 6 == 0) {
cout << "第" << n << "组的晋级名单如下" << endl;
for (int i = 0; i < 3; i++,v1_it++) {
cout << "姓名:" << m[*v1_it].name << endl;
}
}
}
}
int main(int argc,char* argv[]) {
vector<int> v_speakerNum;
map<int, Speaker> m_speakerMsg;
createSpeaker(v_speakerNum, m_speakerMsg);
srand(time(NULL));
random_shuffle(v_speakerNum.begin(), v_speakerNum.end());
vector<int> v1_speakerNum;
speech_contest(1 ,v_speakerNum ,m_speakerMsg ,v1_speakerNum);
printSpeechResault(1, v_speakerNum, m_speakerMsg, v1_speakerNum);
vector<int> v2_speakerNum;
speech_contest(2, v1_speakerNum, m_speakerMsg, v2_speakerNum);
printSpeechResault(2, v1_speakerNum, m_speakerMsg, v2_speakerNum);
vector<int> v3_speakerNum;
speech_contest(3, v2_speakerNum, m_speakerMsg, v3_speakerNum);
printSpeechResault(3, v2_speakerNum, m_speakerMsg, v3_speakerNum);
return 0;
}