用stl写一个自动打分比赛的案例

2023-12-09 17:04
文章标签 自动 案例 stl 比赛 打分

本文主要是介绍用stl写一个自动打分比赛的案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 我们要实现六名选手进行随机平均分为两组,先分别淘汰两组中的最后一名,

再决出第一名。

抽象选手

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

以上就是实现的案例

这篇关于用stl写一个自动打分比赛的案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/474463

相关文章

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

Python Excel实现自动添加编号

《PythonExcel实现自动添加编号》这篇文章主要为大家详细介绍了如何使用Python在Excel中实现自动添加编号效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍简单的说,就是在Excel中有一列h=会有重复

Springboot的自动配置是什么及注意事项

《Springboot的自动配置是什么及注意事项》SpringBoot的自动配置(Auto-configuration)是指框架根据项目的依赖和应用程序的环境自动配置Spring应用上下文中的Bean... 目录核心概念:自动配置的关键特点:自动配置工作原理:示例:需要注意的点1.默认配置可能不适合所有场景

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图