我们要实现六名选手进行随机平均分为两组,先分别淘汰两组中的最后一名,
再决出第一名。
抽象选手
class player
{
public:
string name;
int score;
};
一个选手有名字和分数
首先我们需要vector容器保存选手的编号,便于后续的操作。
再用map容器保存选手的信息和编号。
// 保存选手编号,方便操作
vector v;
vector v1;
vectorv2;
// 保存选手信息
map players;
接下来由我们创建选手
void createplayers(vector& v, map& players)
{
for (int i = 0; i < 6; i++)
{
int id;//编号
//创建一个选手
player p;
cin >> p.name;
id = i + 1;
v.push_back(id);
p.score = 0;
players.insert(make_pair(id, p));
}
}
通过上述函数可以实现创建选手,把id送进v中,把id 和选手信息存进players中。
然后就可以开始第一轮比赛
我们先通过random_shuffle函数对v中的id进行打乱
void radomByGroups(vector& v)
{
random_shuffle(v.begin(),v.end());
}
一开始v中的id为1 2 3 4 5 6 通过random_shuffle函数实现随机
那么比赛中随机打分怎么实现呢,我们可以使用deque容器来求平均分
deque s;
for (int i = 0; i < 10; i++)
{
int sco = rand() % 50 + 50;
s.push_back(sco);
}
sort(s.begin(), s.end());
s.pop_back();
s.pop_front();
int sumscore = accumulate(s.begin(), s.end(), 0);
int aver = sumscore / s.size();
我们去掉最高分和最低分再去求平均值
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
// 打分
deque s;
for (int i = 0; i < 10; i++)
{
int sco = rand() % 50 + 50;
s.push_back(sco);
}
sort(s.begin(), s.end());
s.pop_back();
s.pop_front();
int sumscore = accumulate(s.begin(), s.end(), 0);
int aver = sumscore / s.size();
players[*it].score = aver;
这样一来可以把平均分存入players的score中
接下来我们还要实现去掉两组的最后一名,我们可以使用multimap容器,键值存分数,实值存编号,再让multimap容器对键值从大到小排序
multimap> m; // 键值放分数,实值放编号
m.insert(make_pair(aver, *it));
再把aver,编号存入容器中,接下来就可以实现淘汰最后一名了。
if (m.size() == 3)
{
int cnt = 0;
for (multimap>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++)
{
// 淘汰最后一个
v1.push_back(sit->second);
}
m.clear();
}
以下是比赛的完整代码
void competition(vector& v, map& players, vector& v1)
{
multimap> m; // 键值放分数,实值放编号
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
// 打分
deque s;
for (int i = 0; i < 10; i++)
{
int sco = rand() % 50 + 50;
s.push_back(sco);
}
sort(s.begin(), s.end());
s.pop_back();
s.pop_front();
int sumscore = accumulate(s.begin(), s.end(), 0);
int aver = sumscore / s.size();
players[*it].score = aver;
m.insert(make_pair(aver, *it));
if (m.size() == 3)
{
int cnt = 0;
for (multimap>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++)
{
// 淘汰最后一个
v1.push_back(sit->second);
}
m.clear();
}
}
}
接下来决出第一名,操作与上述基本一致
void competition2(vector& v1, map& players, vector& v2)
{
multimap>m;
for (auto it = v1.begin(); it != v1.end(); it++)
{
dequeq;
for (int i = 0; i < 10; i++)
{
int score = rand() % 50 + 50;
q.push_back(score);
}
q.pop_back();
q.pop_front();
int sumscore = accumulate(q.begin(), q.end(), 0);
int aver = sumscore / q.size();
players[*it].score = aver;
m.insert(make_pair(aver, *it));
if (m.size() == 4)
{
int cnt = 0;
for (auto it = m.begin(); it != m.end() && cnt < 1; it++, cnt++)
{
v2.push_back(it->second);
}
}
}
}
打印选手信息的函数
void printplayeres(vector& v, map& players)
{
for (vector::iterator it = v.begin(); it != v.end(); it++)
{
cout << "name: " << players[*it].name << " score: " << players[*it].score << endl;
}
}
测试
void test()
{
// 保存选手编号,方便操作
vector v;
vector v1;
vectorv2;
// 保存选手信息
map players;
createplayers(v, players);
printplayeres(v, players); // 打印比赛前的选手信息
cout << "---------------" << endl;
radomByGroups(v); // 随机分组
competition(v, players, v1);
//printplayeres(v1, players); // 打印比赛后的选手信息
printplayeres(v1, players); // 打印比赛后的选手信息
cout << "---------------" << endl;
cout << "final winner:" << endl;
competition2(v1, players, v2);
printplayeres(v2, players);
}
结果
a b c d e f
name: a score: 0
name: b score: 0
name: c score: 0
name: d score: 0
name: e score: 0
name: f score: 0
---------------
name: b score: 79
name: d score: 77
name: f score: 81
name: c score: 74
---------------
final winner:
name: b score: 83
以上就是实现的案例