用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

以上就是实现的案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导入PR的视频画面是黑屏的怎么办?

在现代视频编辑领域中&#xff0c;越来越多的人使用Adobe Premiere Pro来编辑和制作视频&#xff0c;但是在某些情况下&#xff0c;用户可能需要透明背景的视频进行创作&#xff0c;那么如何创作透明背景的视频呢&#xff1f; 要制作具有透明背景的视频&#xff0c;我们需要使…

如何赢得并留住订阅者:12 个必须尝试的订阅营销策略

Netflix、Hubspot、Spotify 和 Slack 都是流行的基于订阅的服务&#xff0c;您可能每天都会使用它们&#xff0c;无论是工作还是娱乐。这些例子表明&#xff0c;订阅业务模式深受 SaaS 创业者的青睐。 这种模式的吸引力很容易理解&#xff0c;特别是考虑到订阅市场预计到 2025…

C //例10.5 有一个磁盘文件,内有一些信息。要求第1次将它的内容显示在屏幕上,第2次把它复制到另一文件上。

C程序设计 &#xff08;第四版&#xff09; 谭浩强 例10.5 例10.5 有一个磁盘文件&#xff0c;内有一些信息。要求第1次将它的内容显示在屏幕上&#xff0c;第2次把它复制到另一文件上。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法&a…

mysql支持的整数类型、各类型整数能够表示的数值范围

MySQL :: MySQL 8.2 Reference Manual :: 11.1.2 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT mysql支持的整数有&#xff1a;TINYINT、SMALLINT、MEDIUMINT、INT&#xff08;INT和INTEGER是同义词&#xff09;、BIGINT&#xff0c;各…

【C#】序列化和反序列化,以及System.Text.Json和Newtonsoft.Json比较

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 序列化和反序列化&#xff0c;在实际项目开发过程中用的最多。特别是有对接接口的小伙伴就深有体会。本篇文章就简单聊聊这个知识点。 目录 一、基本概念1.1、序列化1.2反序列化1.3、举例…

AI 赋能 | 智能制造的 AI 算法开发和工程实现

谈到智能制造、智慧工厂&#xff0c;愿景是美好的&#xff0c;借助计算机视觉技术和 AI 算法&#xff0c;为自动化生产线赋予环境感知的能力&#xff0c;从而改善工艺流程&#xff0c;提高生产效率。但是&#xff0c;随着柔性化生产的需求增长&#xff0c;产线的布局调整和功能…

锁的策略及synchronized详解

加锁过程中&#xff0c;处理冲突的过程中&#xff0c;涉及到的一些不同的处理方式。锁的策略决定了线程如何获取和释放锁以及在何种情况下阻塞和唤醒线程。 1. 常见的锁策略 1.1 乐观锁和悲观锁 乐观锁&#xff1a;在加锁之前&#xff0c;预估当前出现锁冲突的概率不大&am…

Docker三 | 数据卷

目录 Docker数据卷简介 添加数据卷的命令 容器数据卷的继承 Docker数据卷简介 Docker容器产生的数据&#xff0c;如果不备份&#xff0c;当容器实例删除后&#xff0c;容器中的数据也会消失&#xff0c;为了保存数据可以在Docker中使用数据卷。Docker数据卷是宿主机的一个可以…

vue3中子组件调用父组件的方法

<script lang"ts" setup>前提 父组件&#xff1a; 子组件&#xff1a; const emit defineEmits([closeson]) 在子组件的方法中使用&#xff1a; emit(closeson)

EP15:动态内存管理概述(c语言)malloc,calloc,realloc函数的介绍使用及柔性数组的介绍

如果学习方向是c方向那么c语言有三个板块的知识是非常重要的. 1:指针 2:结构体 3;动态内存管理. 序言:在c语言中,什么是动态内存 C语言中的动态内存是指在程序运行时&#xff0c;根据需要动态地分配内存空间的一种内存管理方式。与静态内存相比&#xff0c;动态内存的大小和生…

12.ROS导航模块:gmapping、AMCL、map_server、move_base案例

目录 1 导航概述 2 导航简介 2.1 导航模块简介 1.全局地图 2.自身定位 3.路径规划 4.运动控制 5.环境感知 2.2 导航坐标系odom、map 1.简介 2.特点 3.坐标系变换 2.3 导航条件说明 1.硬件 2.软件 3 导航实现 3.1 创建本篇博客的功能包 3.2 建图--gmapping 3.…

JavaScript基础知识整理(最全知识点, 精简版,0基础版)

文章目录 一、输入和输出内容 1.1 输出 1.1.1 在浏览器的控制台输出打印 1.1.2 直接在浏览器的页面上输出内容 1.1.3 页面弹出警告对话框 1.2 输入 二、变量 2.1 变量是什么 2.2 变量的声明和赋值 2.3 变量的命名规范和规范 三、变量扩展&#xff08;数组&#xff09; 3.1 数组…

Cypress:前端自动化测试的终极利器

引言&#xff1a; 在现代软件开发中&#xff0c;前端自动化测试已经成为了一个不可或缺的环节。它不仅可以提高开发效率&#xff0c;减少手动测试的工作量&#xff0c;还可以保证软件的稳定性和质量。而在众多的前端自动化测试工具中&#xff0c;Cypress无疑是其中的佼佼者。本…

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断

文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时&#xff0c;可以查看SQL语句执行信息&#xff0c;便…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑垃圾处理与调峰需求的可持续化城市多能源系统规划》

这个标题涵盖了城市多能源系统规划中的两个重要方面&#xff1a;垃圾处理和调峰需求&#xff0c;并强调了规划的可持续性。 考虑垃圾处理&#xff1a; 含义&#xff1a; 垃圾处理指的是城市废弃物的管理和处置。这可能涉及到废物分类、回收利用、焚烧或填埋等方法。重要性&…

GIS入门,Leaflet介绍,Leaflet可以做什么,网页中如何使用Leaflet地图,vue中如何使用Leaflet地图

VueLeafLet教程推荐&#xff1a;《VueLeaflet入门》 Leaflet介绍 Leaflet是一个开源的JavaScript库&#xff0c;用于创建交互式的地图和地图应用。Leaflet框架具有轻量级、灵活性强、易于使用和扩展等特点&#xff0c;支持各种地图服务商&#xff08;如OpenStreetMap、Google…

前端知识笔记(三十八)———HTTPS:保护网络通信安全的关键

当谈到网络通信和数据传输时&#xff0c;安全性是一个至关重要的问题。在互联网上&#xff0c;有许多敏感信息需要通过网络进行传输&#xff0c;例如个人身份信息、银行账户信息和商业机密等。为了保护这些信息不被未经授权的人访问和篡改&#xff0c;HTTPS&#xff08;超文本传…

【开源】基于Vue+SpringBoot的河南软件客服系统

文末获取源码&#xff0c;项目编号&#xff1a; S 067 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S067。} 文末获取源码&#xff0c;项目编号&#xff1a;S067。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、…

搞懂内存函数

引言 本文介绍memcpy的使用和模拟实现、memmove的使用和模拟实现、memcmp使用、memset使用 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 memcpy memcpy的使用 memcpy的…

JS加密/解密之HOOK实战2

上一篇文章介绍了HOOK常规的应用场景&#xff0c;这篇我们讲一下HOOK其他原生函数。又是一个新的其他思路 很多时候&#xff0c;当我们想要某些网站的请求参数的时候&#xff0c;因为某些加密导致了获取起来很复杂。 这时候hook就十分方便了 源代码 var _JSON_Parse JSON.…