笔记"/>
c+笔记
项目介绍: 有12个参赛选手 共两轮比赛 第一轮比赛12个人分成两组 随机分组 每组6个人
每组经过角逐只留下一半的人(每组6个人变为3个人)
第二轮剩下的一共6个人作为一组角逐 分数从高到低 得出冠亚季军
淘汰规则:每个人由10位评委打分 去掉最高分和最低分 剩下的取平均分
#include <iostream>
using namespace std;
#include <vector>
#include <map>
#include <algorithm>
#include <numeric>//选手数据类型
class Person{
public:Person(int ID, string name){this->ID = ID;this->name = name;}int ID;string name;
};
//输出vector容器
void printVec(vector<Person> &v){for(vector<Person>::iterator it = v.begin();it !=v.end();it++){cout<< "编号:"<<(*it).ID << " 姓名:" << (*it).name << endl;}}
//创建选手并插入到容器中
void createPerson(vector<Person> &v){Person p1(1,"张三");Person p2(2,"李四");Person p3(3,"王五");Person p4(4,"赵六");Person p5(5,"红七");Person p6(6,"韩八");Person p7(7,"孙九");Person p8(8,"马超");Person p9(9,"蔡文姬");Person p10(10,"妲己");Person p11(11,"耀");Person p12(12,"鲁班");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);v.push_back(p6);v.push_back(p7);v.push_back(p8);v.push_back(p9);v.push_back(p10);v.push_back(p11);v.push_back(p12);//随机打乱random_shuffle(v.begin(), v.end());
}
//返回评委打分
int getScore(){//创建一个临时容器用于存放十个评委打分vector<int>v;//开始插入十个随机数 作为十个评委打分for(int i=0;i<10;i++){int socre = rand() % 100;v.push_back(socre);}//从小到达排序sort(v.begin(), v.end());//去除最小值和最大值v.assign(v.begin()+1, v.end()-1);//用accmulate算术生成算法计算总值int total = accumulate(v.begin(),v.end(),0);//除以评委人数得到平均分并返回return total/v.size();
}//求出一组6人的前三名 并返回有序序列multimap
multimap<int,Person> winGroup(vector<Person> &v){//创建临时的容器 用于返回multimap<int,Person>mp;//遍历vector容器 并包含分数插入到multimap中for(vector<Person>::iterator it = v.begin();it !=v.end();it++){mp.insert(pair<int, Person>(getScore(),*it));}//因为multimap自动从小到大排序 删除前三个便是淘汰分数低的三人for(int i=0;i<mp.size()/2+1;i++){mp.erase(mp.begin());}return mp;
}//输出map容器
void printMap(multimap<int,Person> &mp){for(multimap<int,Person>::iterator it = mp.begin();it != mp.end();it++){cout << "分数 = " << (*it).first <<" 编号:"<< (*it).second.ID<<" 名字:" << (*it).second.name<<endl;}
}
int main(){//创建容器存放12个选手vector<Person>v;createPerson(v);//创建容器存放第一组6人vector<Person>v1;v1.assign(v.begin(), v.begin()+6);printVec(v1);cout << "---------------"<<endl;//创建容器存放第二组6人vector<Person>v2;v2.assign(v.begin()+6, v.end());printVec(v2);cout << endl;cout << "经过第一轮激烈的角逐:" << endl;//接收第一组留下的3人multimap<int,Person>mp1;mp1 = winGroup(v1);printMap(mp1);cout << "--------------"<<endl;//接收第二组留下的3人multimap<int,Person>mp2;mp2 = winGroup(v2);printMap(mp2);//清空v1和v2 把multimap数据导入到vector里//因为每组出线的三人已经确定 第一轮的分数需要抛弃 在第二轮重新计算//multimap不仅存放选手名字和编号 而且存放分数 vector只存放选手信息v1.clear();v2.clear();for(multimap<int,Person>::iterator it = mp1.begin();it != mp1.end();it++){v1.push_back((*it).second);}for(multimap<int,Person>::iterator it = mp2.begin();it != mp2.end();it++){v2.push_back((*it).second);}cout << endl;cout << "合并以后:" << endl;//合并第一轮每组留下的3个人到一个vector容器vector<Person>v_Union;v_Union.insert(v_Union.begin(), v1.begin(),v1.end());v_Union.insert(v_Union.end(), v2.begin(),v2.end());printVec(v_Union);cout << "-----------"<<endl;//得出第二轮的结果 用multimap接收multimap<int,Person>mp3;mp3 = winGroup(v_Union);cout << "最后的冠亚季军:"<<endl;//输出第二轮的冠亚季军int rank = 3;for(multimap<int,Person>::iterator it = mp3.begin();it != mp3.end();it++){cout << "第" << rank << "名是:"<<(*it).second.name << " 他的编号是: "<< (*it).second.ID<<" 他的最终分数是: " << (*it).first << endl;rank--;}return 0;
}
输出结果:
编号:7 姓名:孙九
编号:11 姓名:耀
编号:8 姓名:马超
编号:5 姓名:红七
编号:1 姓名:张三
编号:9 姓名:蔡文姬
---------------
编号:10 姓名:妲己
编号:12 姓名:鲁班
编号:2 姓名:李四
编号:4 姓名:赵六
编号:3 姓名:王五
编号:6 姓名:韩八
经过第一轮激烈的角逐:
分数 = 44 编号:8 名字:马超
分数 = 45 编号:5 名字:红七
分数 = 68 编号:1 名字:张三
--------------
分数 = 48 编号:12 名字:鲁班
分数 = 50 编号:6 名字:韩八
分数 = 58 编号:3 名字:王五
合并以后:
编号:8 姓名:马超
编号:5 姓名:红七
编号:1 姓名:张三
编号:12 姓名:鲁班
编号:6 姓名:韩八
编号:3 姓名:王五
-----------
最后的冠亚季军:
第3名是:红七 他的编号是: 5 他的最终分数是: 51
第2名是:王五 他的编号是: 3 他的最终分数是: 52
第1名是:鲁班 他的编号是: 12 他的最终分数是: 54
更多推荐
c+笔记
发布评论