华为OD机试真题 - 抢7游戏(Python/JS/C/C++ 2024 D卷 100分)

news/2024/9/17 18:56:38/ 标签: 华为od, 游戏, python

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

A、B两个人玩抢7游戏游戏规则为A先报一个起始数字X (10 <= X <= 10000),B报下一个数字Y,(0<X-Y<3),A再报一个数字Z(0<Y-Z<3),以此类推,直到其中一个抢到7,抢到7即为胜者,在B赢得比赛的情况下,一共有多少种组合?

二、输入描述

起始数字M,如100

10 <= M <= 10000

三、输出描述

B能赢得比赛的组合次数。

四、解题思路

  1. 问题分析:
    • 这个游戏本质上是从起始数字 m 到 7 的一个递减过程。
    • 每次可以选择减1或减2,对应了两种操作。
    • B 想要赢,必须在轮到自己时拿到 7。
  2. 问题转化:
    • 我们可以将问题转化为排列组合问题。
    • 从 m 到 7 的过程可以看作是排列若干个"减1"和"减2"操作。
    • "减1"操作的次数 = m - 7
    • 总操作次数必须为奇数,这样最后一步(到7)才会是 B 操作。
  3. 计算策略:
    • 初始时,所有操作都是"减1",即 oneCount = m - 7, twoCount = 0。
    • 然后我们逐步将两个"减1"合并为一个"减2",遍历所有可能的组合。
    • 对于每种有效组合(总步数为奇数),计算其不重复排列数。
  4. 排列数计算:
    • 使用组合数学公式:(oneCount + twoCount)! / (oneCount! * twoCount!)
    • 这个公式计算了在总操作序列中,"减1"和"减2"的所有不重复排列方式。
  5. 大数处理:
    • 由于数字可能很大,我们使用 BigInteger 来处理计算,避免溢出。
    • 预先计算阶乘,存储在数组中,以提高效率。
  6. 结果累加:
    • 对每种有效组合的排列数进行累加,得到最终 B 获胜的总情况数。

五、测试用例

1、输入

10

2、输出

1

3、说明

只有一种赢的组合,A起始选择10,B接着选择9,A接着选择8,B接着选择7赢得胜利。

六、Python算法源码

python">from math import factorial
from functools import lru_cache@lru_cache(None)
def get_permutation_count(one_count, two_count):if one_count == 0 or two_count == 0:return 1else:total_steps = one_count + two_countreturn factorial(total_steps) // (factorial(one_count) * factorial(two_count))def main():m = int(input("请输入起始数字: "))  # 读取起始数字one_count = m - 7  # 初始的1的数量(每次减1的操作数)two_count = 0      # 初始的2的数量(每次减2的操作数)ans = 0  # 用于记录B赢的情况总数# 遍历所有可能的1和2的组合while one_count >= 0:# 当总步数为奇数时,B才能赢(因为A先手)if (one_count + two_count) % 2 != 0:# 计算当前组合的排列数,并加到总数中ans += get_permutation_count(one_count, two_count)# 将两个1合并为一个2(即减少两次"减1",增加一次"减2")one_count -= 2two_count += 1# 输出结果print(ans)if __name__ == "__main__":main()

七、JavaScript算法源码

function factorial(n) {if (n === 0) return 1;let result = 1;for (let i = 1; i <= n; i++) {result *= i;}return result;
}function getPermutationCount(oneCount, twoCount) {if (oneCount === 0 || twoCount === 0) {return 1;} else {let totalSteps = oneCount + twoCount;return factorial(totalSteps) / (factorial(oneCount) * factorial(twoCount));}
}function main() {const m = parseInt(prompt("请输入起始数字: "), 10);  // 读取起始数字let oneCount = m - 7;  // 初始的1的数量(每次减1的操作数)let twoCount = 0;      // 初始的2的数量(每次减2的操作数)let ans = 0;  // 用于记录B赢的情况总数// 遍历所有可能的1和2的组合while (oneCount >= 0) {// 当总步数为奇数时,B才能赢(因为A先手)if ((oneCount + twoCount) % 2 !== 0) {// 计算当前组合的排列数,并加到总数中ans += getPermutationCount(oneCount, twoCount);}// 将两个1合并为一个2(即减少两次"减1",增加一次"减2")oneCount -= 2;twoCount += 1;}// 输出结果console.log(ans);
}main();

八、C算法源码

#include <stdio.h>typedef unsigned long long ull;// 计算阶乘
ull factorial(int n) {if (n == 0) return 1;ull result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;
}// 计算不重复的全排列数
ull get_permutation_count(int one_count, int two_count) {if (one_count == 0 || two_count == 0) {return 1;} else {int total_steps = one_count + two_count;return factorial(total_steps) / (factorial(one_count) * factorial(two_count));}
}int main() {int m;printf("请输入起始数字: ");scanf("%d", &m);  // 读取起始数字int one_count = m - 7;  // 初始的1的数量(每次减1的操作数)int two_count = 0;      // 初始的2的数量(每次减2的操作数)ull ans = 0;  // 用于记录B赢的情况总数// 遍历所有可能的1和2的组合while (one_count >= 0) {// 当总步数为奇数时,B才能赢(因为A先手)if ((one_count + two_count) % 2 != 0) {// 计算当前组合的排列数,并加到总数中ans += get_permutation_count(one_count, two_count);}// 将两个1合并为一个2(即减少两次"减1",增加一次"减2")one_count -= 2;two_count += 1;}// 输出结果printf("%llu\n", ans);return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
#include <boost/multiprecision/cpp_int.hpp>  // 使用Boost库中的大整数类型using namespace std;
using namespace boost::multiprecision;vector<cpp_int> factor;// 初始化阶乘数组
void initFactor(int n) {factor.resize(n + 1);factor[0] = 1;  // 0! = 1for (int i = 1; i <= n; i++) {factor[i] = factor[i - 1] * i;}
}// 计算不重复的全排列数
cpp_int getPermutationCount(int oneCount, int twoCount) {if (oneCount == 0 || twoCount == 0) {return 1;  // 只有1或只有2的情况,只有一种排列方式} else {// 使用组合数学公式计算不重复的排列数// 公式:(oneCount + twoCount)! / (oneCount! * twoCount!)return factor[oneCount + twoCount] / (factor[oneCount] * factor[twoCount]);}
}int main() {int m;cout << "请输入起始数字: ";cin >> m;  // 读取起始数字// 初始化阶乘数组,最大需要计算 (m-7)!initFactor(m - 7);int oneCount = m - 7;  // 初始的1的数量(每次减1的操作数)int twoCount = 0;      // 初始的2的数量(每次减2的操作数)cpp_int ans = 0;       // 用于记录B赢的情况总数// 遍历所有可能的1和2的组合while (oneCount >= 0) {// 当总步数为奇数时,B才能赢(因为A先手)if ((oneCount + twoCount) % 2 != 0) {// 计算当前组合的排列数,并加到总数中ans += getPermutationCount(oneCount, twoCount);}// 将两个1合并为一个2(即减少两次"减1",增加一次"减2")oneCount -= 2;twoCount += 1;}// 输出结果cout << ans << endl;return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.ppmy.cn/news/1523495.html

相关文章

【Mysql】系统服务启动访问报错问题处理:this is incompatible with sql_mode=only_full_group_by

一、背景&#xff1a; 本来已经正常运行的平台&#xff0c;突然有一天由于对服务器进行部分操作迁移&#xff0c;发现jar可以正常启动&#xff0c;但是访问功能一直报错&#xff0c;监控后台日志后&#xff0c;发现了问题&#xff1a; 报错的具体信息如下&#xff1a; Caused…

MySQL JDBC URL各参数详解

jdbc:mysql://localhost:3306/test?userroot&password123456&useUnicodetrue&characterEncodinggbk &autoReconnecttrue&failOverReadOnlyfalse&serverTimezoneUTC&drivercom.mysql.cj.jdbc.Driver 参数名称参数说明缺省值user指定用于连接数据库…

暑期学习总结

iOS学习 前言无限轮播图换头像网络请求按钮的configuration属性总结 前言 经过暑期培训&#xff0c;完成了五个项目的仿写&#xff0c;在项目中将零散的内容经过实践学习&#xff0c;有了不少收获&#xff0c;因此来总结一下比较重要的内容。 无限轮播图 这是写项目的第一个难…

UnLua调用蓝图变量、动画、函数

一、调用蓝图声明的变量 1、在蓝图中声明一个String类型变量title 默认值为MyFirstTitle 2、在UnLua中调用 function WBP_FirstLua_C:Construct()print("Title~"..self.title) end二、绑定蓝图的UMG组件 1、在蓝图中制作按钮btnTest 2、在Lua中绑定该按钮的点击事…

问卷调查,动静IP应该如何选择?

在探讨问卷调查这一领域时&#xff0c;选择使用动态IP还是静态IP&#xff0c;成为了许多从业者及市场研究者面临的重要决策&#xff0c;它不仅关乎数据收集的效率与质量&#xff0c;还直接影响到问卷调查的合法性与安全性。本文将从多个维度深入分析这两种IP类型的优劣&#xf…

NAT技术介绍+缺陷(内网穿透+工具),NAPT(介绍,替换过程,原理,NAT转换表)

目录 NAT技术 介绍 NAT转换表 引入 介绍 NAPT技术介绍 NAPT替换过程 NAPT原理 注意点 NAT缺陷 无法直接访问其他内网主机 内网穿透 工具 其他 NAT技术 介绍 NAT 是一种网络技术&#xff0c;它允许在一个公共 IP 地址和多个私有 IP 地址(入口路由器的wan口地址 …

pdf怎么压缩小一些?关于可以推荐的几种pdf压缩方法

pdf怎么压缩小一些&#xff1f;在工作中&#xff0c;我们经常处理PDF文件。大文件不仅存储麻烦&#xff0c;还会拖慢传输速度。因此&#xff0c;我们通常希望将这些文件压缩成更小的尺寸。压缩后的文件更便于分享和管理&#xff0c;适用于云存储、社交媒体或其他在线平台&#…

JAVA—单元测试

单元测试&#xff1a;就是针对最小的功能单元&#xff08;方法&#xff09;&#xff0c;编写测试代码对其进行正确性测试 之前是使用main函数调用来进行检测&#xff0c;无法实现自动化测试 也会影响其他方法的测试 目录 1.junit框架概述 2.junit框架的常见注解 1.junit框架…

数据库系列之GaussDB数据库中逻辑对象关系简析

初次接触openGauss或GaussDB数据库的逻辑对象&#xff0c;被其中的表空间、数据库、schema和用户之间的关系&#xff0c;以及授权管理困惑住了&#xff0c;与熟悉的MySQL数据库的逻辑对象又有明显的不同。本文旨在简要梳理下GaussDB数据库逻辑对象之间的关系&#xff0c;以加深…

《深度学习》OpenCV 模版匹配多个对象、图片旋转 综合应用

目录 一、模板匹配 1、什么是模版匹配 2、原理 3、应用领域 4、案例实现 1&#xff09;模版图片和输入图片信息 2&#xff09;代码实现 运行结果&#xff1a; 二、图像旋转 1、使用numpy方法 运行结果&#xff1a; &#xff08;图片来源网络&#xff0c;如有侵权敬…

初始QT!

作业&#xff1a;了解QT文件夹初始代码的意义 QT core gui #QT工程所需得类库 core是核心库 gui图形化界面相关库类 greaterThan(QT_MAJOR_VERSION, 4): QT widgets #版本超过4.0会加上widgetsCONFIG c11 #该编辑器支持c11后的版本 # The following define makes you…

kafka的安装和启动

一、kafka介绍 1&#xff0c;kafka简单介绍 kafka是一款分布式、支持分区的、多副本&#xff0c;基于zookeeper协调的分布式消息系统。最大的特性就是可以实时处理大量数据来满足需求。 2&#xff0c;kafka使用场景 1&#xff0c;日志收集&#xff1a;可以用kafka收集各种服务…

如何优化 MySQL 的连接管理和并发控制策略

如何优化 MySQL 的连接管理和并发控制策略 一、引言 MySQL 的连接管理和并发控制策略对于数据库的性能和稳定性至关重要。优化这些策略可以提高数据库的响应速度、吞吐量和资源利用率。本文将探讨如何优化 MySQL 的连接管理和并发控制策略,以满足不同应用场景的需求。 二、…

React Native 0.76,New Architecture 将成为默认模式,全新的 RN 来了

关于 React Native 的 New Architecture 概念&#xff0c;最早应该是从 2018 年 RN 团队决定重写大量底层实现开始&#xff0c;因为那时候 React Native 面临各种结构问题和性能瓶颈&#xff0c;最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始&#xff0c;New A…

百度MEG数据开发治理平台-TDS

导读 百度MEG的上一代大数据产品存在平台分散、质量不均和易用性差等问题&#xff0c;导致开发效率低下、学习成本高&#xff0c;业务需求响应迟缓。为了解决这些问题&#xff0c;百度MEG内部开发了图灵3.0生态系统。图灵3.0覆盖了数据全生命周期&#xff0c;包括Turing Data …

2025年【DevOps】相关技术论文题目参考,50个,总有一个是你需要的

DevOps 基于DevOps的持续集成与部署&#xff08;CI/CD&#xff09;系统的开发基于DevOps的自动化测试框架的实现基于DevOps的微服务监控与日志分析系统的开发基于DevOps的跨平台应用部署系统的实现基于DevOps的云原生应用开发框架的开发基于DevOps的自动化测试工具的实现基于D…

Vue3+TypeScript二次封装axios

安装如下 npm install axios 第一步&#xff1a;创建config配置文件&#xff0c;用于存放请求后端的ip地址&#xff0c;用于后期打包后便于修改ip地址。 注&#xff1a;typescript要求参数要有类型。&#xff08;ES6 定义对象 属性 类型 修改的是属性的值&#xff09; inte…

理解Sigmoid激活函数原理和实现

Sigmoid 激活函数是一种广泛应用于机器学习和深度学习中的非线性函数&#xff0c;特别是在二分类问题中。它的作用是将一个实数值映射到(0, 1)区间&#xff0c;使得输出可以被解释为概率值&#xff0c;这在处理二分类问题时非常有用。 Sigmoid 函数的定义 Sigmoid 函数的数学…

[论文笔记] LLM大模型剪枝篇——2、剪枝总体方案

https://github.com/sramshetty/ShortGPT/tree/main My剪枝方案(暂定): 剪枝目标:1.5B —> 100~600M 剪枝方法: 层粒度剪枝 1、基于BI分数选择P%的冗余层,P=60~80 2、对前N%冗余层,直接删除full layer。N=20(N:剪枝崩溃临界点,LLaMA2在45%,Mistral-7B在35%,Qw…

2. c#从不同cs的文件调用函数

1.文件目录如下&#xff1a; 2. Program.cs文件的主函数如下 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms;namespace datasAnalysis {internal static class Program{/// <summary>…