?我們要實現六名選手進行隨機平均分為兩組,先分別淘汰兩組中的最后一名,
再決出第一名。
抽象選手
class player
{
public:string name;int score;
};
一個選手有名字和分數
首先我們需要vector容器保存選手的編號,便于后續的操作。
再用map容器保存選手的信息和編號。
// 保存選手編號,方便操作vector<int> v;vector<int> v1;vector<int>v2;// 保存選手信息map<int, player> players;
接下來由我們創建選手
void createplayers(vector<int>& v, map<int, player>& 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<int>& v)
{random_shuffle(v.begin(),v.end());
}
一開始v中的id為1 2 3 4 5 6 通過random_shuffle函數實現隨機
那么比賽中隨機打分怎么實現呢,我們可以使用deque容器來求平均分
deque<int> 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<int>::iterator it = v.begin(); it != v.end(); it++){// 打分deque<int> 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<int, int, greater<>> m; // 鍵值放分數,實值放編號
m.insert(make_pair(aver, *it));
再把aver,編號存入容器中,接下來就可以實現淘汰最后一名了。
if (m.size() == 3){int cnt = 0;for (multimap<int, int, greater<>>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++){// 淘汰最后一個v1.push_back(sit->second);}m.clear();}
以下是比賽的完整代碼
void competition(vector<int>& v, map<int, player>& players, vector<int>& v1)
{multimap<int, int, greater<>> m; // 鍵值放分數,實值放編號for (vector<int>::iterator it = v.begin(); it != v.end(); it++){// 打分deque<int> 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<int, int, greater<>>::iterator sit = m.begin(); cnt < 2 && sit != m.end(); sit++, cnt++){// 淘汰最后一個v1.push_back(sit->second);}m.clear();}}
}
接下來決出第一名,操作與上述基本一致
void competition2(vector<int>& v1, map<int, player>& players, vector<int>& v2)
{multimap<int, int, greater<>>m;for (auto it = v1.begin(); it != v1.end(); it++){deque<int>q;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<int>& v, map<int, player>& players)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << "name: " << players[*it].name << " score: " << players[*it].score << endl;}
}
測試?
void test()
{// 保存選手編號,方便操作vector<int> v;vector<int> v1;vector<int>v2;// 保存選手信息map<int, player> 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
以上就是實現的案例