1 //案例:学校演讲比赛
2 //1)某市举行一场演讲比赛,共有24个人参加,按参加顺序设置参赛号。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。
3 //2)比赛方式:分组比赛
4 // 第一轮分为4个小组,根据参赛号顺序依次划分,比如100 - 105为一组,106 - 111为第二组,依次类推,每组6个人,每人分别按参赛号顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
5 // 第二轮分为2个小组,每组6人,每个人分别按参赛号顺序演讲。当小组完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。
6 // 第三轮只剩下6个人,本轮为决赛,选出前三名。
7 // 选手每次要随机分组,进行比赛。
8 //4)比赛评分:10个评委打分,去除最低、最高分,求平均分
9 // 每个选手演讲完由10个评委分别打分。该选手的最终得分是去掉一个最高分和一个最低分,求得剩下的8个成绩的平均分。选手的名次按得分降序排列,若得分一样,按参赛号升序排名。
10 //
11 //用STL编程,求解一下问题
12 //1) 请打印出所有选手的名字与参赛号,并以参赛号的升序排列。
13 //2) 打印每一轮比赛前,分组情况
14 //3) 打印每一轮比赛后,小组晋级名单
15 //4) 打印决赛前三名,选手名称、成绩。
// 【起始在这里你也可以用map/multimap来做】
16 #include<iostream>
17 #include<vector>
18 #include<deque>
19 #include<algorithm>
20 using namespace std;
21
22 class Player
23 {
24 public:
25 Player() {};
26 Player(int num) :num_(num){};
27 ~Player() {};
28 void getFinalScores();
29
30 int num_;
31 deque<int> scores_;// 10个分数
32 int finalscores_; // 最终得分
33 private:
34
35 };
36
37 bool scoresRank(int& a, int& b)
38 {
39 return a > b;
40 }
41
42 void Player::getFinalScores()
43 {
44 sort(scores_.begin(), scores_.end(), scoresRank);
45 scores_.pop_back();//去掉最低分
46 scores_.pop_front();//去掉最高分
47 int totalscores = 0;
48 for (deque<int>::iterator itr = scores_.begin(); itr != scores_.end(); itr ++)
49 {
50 totalscores += (*itr);
51 }
52 finalscores_ = totalscores / 8; //求平均分
53 }
54
55 void showScores(vector<Player>& allplayers)
56 {
57 for (auto& player:allplayers)
58 {
59 cout << "player :" << player.num_ << " scores : " << player.finalscores_ << endl;
60 }
61 }
62
63 bool groupRank(Player& p1, Player& p2)
64 {
65 return p1.finalscores_ > p2.finalscores_;
66 }
67
68 void firstGame(vector<Player>& allplayers)
69 {
70 // 打分并得到24名选手最终得分
71 for (size_t i = 0; i < allplayers.size(); i++) // 24 players
72 {
73 allplayers[i].num_ = 100 + i;
74 for (size_t j = 0; j < 10; j++) // 10个评委 给每一个选手打分
75 {
76 int randscore = rand() % 41 + 60;
77 allplayers[i].scores_.push_back(randscore);
78 }
79 allplayers[i].getFinalScores();
80 }
81 cout << "第一轮24个人的分数 :" << endl;
82 showScores(allplayers);
83 //分4组并淘汰每组垫底3名
84 for (size_t i = 0; i < 4; i++)
85 {
86 sort(allplayers.begin() + i*6, allplayers.begin() + (i+1)*6, groupRank);
87 }
88 cout << "小组内部排序[6人一组,从最高分 -> 最低分]" << endl;
89 showScores(allplayers);
90 vector<Player> allplayers_;
91 // 取出每组前3名
92 for (size_t i = 0; i < 4; i++)
93 {
94 //allplayers.erase(allplayers.begin() + i * 6 + 2, allplayers.begin() + (i + 1) * 6);
95 allplayers_.push_back(allplayers[0 + 6*i]);
96 allplayers_.push_back(allplayers[1 + 6*i]);
97 allplayers_.push_back(allplayers[2 + 6*i]);
98 }
99 cout << "小组内部淘汰3人" << endl;
100 showScores(allplayers_);
101 allplayers.clear();
102 allplayers = allplayers_;
103 }
104
105 void secondGame(vector<Player>& allplayers)
106 {
107 // 打分并得到24名选手最终得分
108 for (size_t i = 0; i < allplayers.size(); i++) // 24 players
109 {
110 //allplayers[i].num_ = 100 + i;
111 allplayers[i].scores_.clear();//清除第一轮得分
112 for (size_t j = 0; j < 10; j++) // 10个评委 给每一个选手打分
113 {
114 int randscore = rand() % 41 + 60;
115 allplayers[i].scores_.push_back(randscore);
116 }
117 allplayers[i].getFinalScores();
118 }
119 cout << "第二轮12个人的分数 :" << endl;
120 showScores(allplayers);
121
122 //分2组并淘汰每组垫底3名
123 for (size_t i = 0; i < 2; i++)
124 {
125 sort(allplayers.begin() + i * 6, allplayers.begin() + (i + 1) * 6, groupRank);
126 }
127 cout << "小组内部排序[6人一组,从最高分 -> 最低分]" << endl;
128 showScores(allplayers);
129 vector<Player> allplayers_;
130 // 取出每组前3名
131 for (size_t i = 0; i < 2; i++)
132 {
133 //allplayers.erase(allplayers.begin() + i * 6 + 2, allplayers.begin() + (i + 1) * 6);
134 allplayers_.push_back(allplayers[0 + 6 * i]);
135 allplayers_.push_back(allplayers[1 + 6 * i]);
136 allplayers_.push_back(allplayers[2 + 6 * i]);
137 }
138 cout << "小组内部淘汰3人" << endl;
139 showScores(allplayers_);
140 allplayers.clear();
141 allplayers = allplayers_;
142 }
143
144 void thirdGame(vector<Player>& allplayers)
145 {
146 sort(allplayers.begin(), allplayers.end(), groupRank);
147 cout << "第三轮6个人的分数 :" << endl;
148 showScores(allplayers);
149
150 //去掉后三名
151 allplayers.pop_back();
152 allplayers.pop_back();
153 allplayers.pop_back();
154 }
155
156 int main()
157 {
158 vector<Player> allplayers;
159 allplayers.resize(24);
160 firstGame(allplayers);
161 secondGame(allplayers);
162 thirdGame(allplayers);
163 cout << "第三轮最终获奖的3个人的分数 :" << endl;
164 showScores(allplayers);
165 return 1;
166 }