前言:
前面讲了很多关于STL的算法和容器的知识,如果不多训练的话,看多少内容都是知识点的堆积,过眼云烟不会记得太久,案例训练可以使我们加深对于知识点的掌握.知识点是很多的,学不完.最重要的是解决问题的能力.
场景描述:
某市举行一场演讲,比赛共有24个人参加,比赛共三轮,前两轮为淘汰赛,第三轮为决赛比赛方式分组比赛,
每组六个人,选手每次要随机分组进行比赛,第一轮分为四个小组,每组六个人,每人按照抽签顺序演讲,
当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛,第二轮分为两个小组,每组六个人,比赛完毕,
淘汰组内排名最后的三个选手,然后继续下一个小组的比赛,第三轮只剩下六个人,本文为决赛选出前三名
比赛评分十个评委打分去除最低最高分求平均分每个选手演讲完由十个评委分别打分
该选手的最终得分是去掉一个最高分和去掉一个最低分求得剩下的八个成绩的平均分选手的名次按得分顺序排列
请用STL解决下面的问题
请打印出所有选手的名字与参赛号,并以参赛后的升序排列
打印每一轮比赛后小组比赛成绩和小组晋级名单,
打印决赛前三名选手名称和成绩
需求分析
产生选手 抽签 比赛 查看结果
选手设计一个类
所有选手编号和选手信息 ,放容器map内
第一轮晋级名单放在一个容器里,后面也是如此
每个小组的得分信息放在multimap(方便排序)
每个选手得分放在deque( 双端数组 方便去除最高分最低分)
#include
#include
using namespace std;
#include"vector"//数组的尾部添加和弹出元素,获取头部元素 尾部元素 数组的方式遍历
#include"map"
#include"string"
#include"deque"//双端数组
#include"list"//结点序号是从0开始,不是随机迭代器
#include"algorithm"
#include"set"//集合 有序 唯一 可以放基础 也可以放自定义 (排序!!!)
#include"functional"
#include"iterator"//输出流迭代器
//容器提供的都是值拷贝 也就是说复制了一份 不能有深拷贝,浅拷贝!!!!!
class Speaker //先定义一个类
{
public:
string m_name;
int m_score[3];
};
//产生选手
int GenSpeaker(map&mapSpeaker, vector &v)
{
string str = "ZXCVBNMLKJHGFDSAQWERTYUI";//每个选手起个名字
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(100 + i, tmp));
}
for (int i = 0; i < 24; i++)
{
v.push_back(100 + i);//参加比赛的人员
}
return 0;
}
//选手抽签
int speech_contest_draw(vector &v)
{
random_shuffle(v.begin(), v.end());//抽签完了这就
return 0;
};
//选手比赛
int speech_contest(int index, vector&v1, map&mapSpeaker, vector&v2)
{
multimap>multimapGroup;//小组成绩
int tmpCount = 0;
for (vector::iterator it = v1.begin(); it != v1.end(); it++)
{
tmpCount++;
//打分
{
deque dscore;
for (int j = 0; j < 10; j++)//10个评委打分
{
int score = 50 + rand() % 50;
dscore.push_back(score);
}
sort(dscore.begin(), dscore.end());//排序
dscore.pop_back();
dscore.pop_front();//去除最低分 最高分
}
//求平均分
int scoresum=accumulate(dscore.begin(), dscore.end(),0);
int scoreavg = scoresum / dscore.size();
mapSpeaker[*it].m_score[index] = scoreavg;//选得分 存入容器中
multimapGroup.insert(pair(scoreavg,*it));
}
//处理分组
if (tmpCount % 6 == 0)
{
cout << "小组的比赛成绩" << endl;
}
for (multimap>::iterator mit = multimapGroup.begin(); mit != multimapGroup.end(); mit++)
{
//编号 姓名 得分
cout << mit->second << " " << mapSpeaker[mit->second].m_name << " " << mit->first << endl;//小组得分
}
//前三名晋级 也就是说遍历这个容器
while (multimapGroup.size() > 3)
{
multimap>::iterator it1 = multimapGroup.begin();
v2.push_back(it1->second);//把前三名放到v2中
multimapGroup.erase(it1);
}
multimapGroup.clear();//清空本小组 比赛成绩
return 0;
};
//查看每一轮比赛结果
int speech_contest_print(int index, vector&v, map&mapSpeake)
{
printf("第%d轮晋级名单
", index + 1);
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
cout << "" << *it << " " << mapSpeake[*it].m_name << " " << < mapSpeake[*it].m_score[inedx] << endl;
}
return 0;
};
void main()
{
//容器设计放所有的选手
map mapSpeaker;
vector v1;//第一轮
vector v2;//第二轮
vector v3;//第三轮
vector v4;//最后前三名
//产生选手 得到第一轮选手的比赛名单
GenSpeaker(mapSpeaker, v1);
//第一轮选手抽签 选手比赛 查看比赛结果
speech_contest_draw(v1);
speech_contest(0,v1, mapSpeaker, v2);//这4个参数分别是 第一轮 选手参加比赛 选手得分 选手比赛结果
speech_contest_print(0,v2,mapSpeaker);
//第二轮选手抽签 选手比赛 查看比赛结果
speech_contest_draw(v2);
speech_contest(0, v2, mapSpeaker, v3);//这4个参数分别是 第一轮 选手参加比赛 选手得分 选手比赛结果
speech_contest_print(0, v3, mapSpeaker);
//第三轮选手抽签 选手比赛 查看比赛结果
speech_contest_draw(v3);
speech_contest(0, v3, mapSpeaker, v4);//这4个参数分别是 第一轮 选手参加比赛 选手得分 选手比赛结果
speech_contest_print(0, v4, mapSpeaker);
cout << "hello..." << endl;
system("pause");
return;
}
页面更新:2024-05-24
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号