news 2026/4/16 15:46:45

华为OD机考双机位C卷 - 挑选宝石 (Java Python JS C/C++ GO )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机考双机位C卷 - 挑选宝石 (Java Python JS C/C++ GO )

最新华为上机考试

真题目录:点击查看目录

华为OD面试真题精选:点击立即查看
2025华为od机试双机位C卷

题目描述

游乐园有一款互动游戏,游戏开始时会提供n个宝石,每个宝石都一个属性值a1,a2,…an.玩家在游戏前可以挑选x颗宝石,将这些宝石的属性值相乘组成玩家的属性值。游戏玩家需要y点属性值,请帮助游戏玩家计算有多少种计算方式。

输入描述

第一行:三个整数n,x,y

  • 第一个整数n(0 < n <20)表示宝石总数量。
  • 第二个整数x(0<x <=n),表示可以选择宝石个数
  • 第三个整数y,表示通过游戏需要的属性值

第二行:n个整数,a1,a2,…an(-100 < ai < 100),表示每个宝石的属性值。

输出描述

输出一个整数,表示玩家可以通过游戏的挑选方式的数量。

示例1

输入

4 2 8 2 -3 4 5

输出

3

说明

解题思路

这是一个经典的组合问题,可以通过深度优先搜索 (DFS) / 回溯法来解决。

由于宝石数量n nn较小(n < 20 n < 20n<20),我们可以遍历所有可能的组合,找出其中选取x xx个宝石且乘积等于y yy的方案数量。

解题思路

  1. 数据读取:读取n , x , y n, x, yn,x,y以及n nn个宝石的属性值。
  2. 回溯算法 (DFS)
    • 我们需要设计一个递归函数,记录当前遍历到的宝石索引 (index)、已经选取的宝石数量 (count) 以及当前的乘积 (currentVal)。
    • 递归出口
      • 如果已经选够了x xx个宝石:检查当前乘积是否等于y yy。如果是,计数器加 1。无论是否相等,都结束当前分支。
      • 如果遍历完了所有宝石(index == n)但没选够x xx个:结束当前分支。
    • 递归分支
      • 选择当前宝石:进入下一层递归,count + 1,乘积更新为currentVal * gems[index]
      • 不选当前宝石:进入下一层递归,count不变,乘积不变。
  3. 数据类型:虽然单个属性值在int范围内,但多个数相乘可能会超出int范围,建议使用long来存储乘积(尽管y yy也是输入值,但在中间计算过程中防止溢出是个好习惯)。

Java

importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);// 1. 读取 n, x, yif(!scanner.hasNext())return;intn=scanner.nextInt();intx=scanner.nextInt();inty=scanner.nextInt();// 2. 读取宝石属性值long[]gems=newlong[n];for(inti=0;i<n;i++){gems[i]=scanner.nextLong();}intres=0;inttotalStates=1<<n;// 2的n次方// 3. 二进制枚举所有组合for(inti=0;i<totalStates;i++){// 优化:利用 bitCount 快速判断当前组合是否选了 x 个if(Integer.bitCount(i)!=x){continue;}longprod=1L;// 计算当前组合的乘积for(intj=0;j<n;j++){// 判断二进制第 j 位是否为 1if((i&(1<<j))!=0){prod*=gems[j];}}// 4. 判断条件// 根据用例1 (目标8,输出3),这里必须是 "大于等于"// 2*4=8, 2*5=10, 4*5=20,共3种if(prod>=y){res++;}}System.out.println(res);}}

Python

importsys# 1. 读取 n, x, yn,x,y=map(int,input().split())# 2. 读取宝石属性值gems=list(map(int,input().split()))res=0totalStates=1<<n# 2的n次方# 3. 二进制枚举所有组合foriinrange(totalStates):# 优化:利用 bit_count 快速判断当前组合是否选了 x 个ifbin(i).count('1')!=x:continueprod=1# 计算当前组合的乘积forjinrange(n):# 判断二进制第 j 位是否为 1if(i&(1<<j))!=0:prod*=gems[j]# 4. 判断条件# 根据用例1 (目标8,输出3),这里必须是 "大于等于"# 2*4=8, 2*5=10, 4*5=20,共3种ifprod>=y:res+=1print(res)

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinputLines=[];rl.on('line',(line)=>{inputLines.push(line);}).on('close',()=>{// 1. 读取 n, x, yconst[n,x,y]=inputLines[0].split(' ').map(Number);// 2. 读取宝石属性值constgems=inputLines[1].split(' ').map(Number);letres=0;consttotalStates=1<<n;// 2的n次方// 3. 二进制枚举所有组合for(leti=0;i<totalStates;i++){// 优化:利用 bitCount 快速判断当前组合是否选了 x 个if(i.toString(2).split('1').length-1!==x){continue;}letprod=1n;// 计算当前组合的乘积for(letj=0;j<n;j++){// 判断二进制第 j 位是否为 1if((i&(1<<j))!==0){prod*=BigInt(gems[j]);}}// 4. 判断条件// 根据用例1 (目标8,输出3),这里必须是 "大于等于"// 2*4=8, 2*5=10, 4*5=20,共3种if(prod>=BigInt(y)){res++;}}console.log(res);});

C++

#include<iostream>#include<vector>intmain(){// 1. 读取 n, x, yintn,x;longlongy;std::cin>>n>>x>>y;// 2. 读取宝石属性值std::vector<longlong>gems(n);for(inti=0;i<n;i++){std::cin>>gems[i];}intres=0;inttotalStates=1<<n;// 2的n次方// 3. 二进制枚举所有组合for(inti=0;i<totalStates;i++){// 优化:利用 __builtin_popcount 快速判断当前组合是否选了 x 个if(__builtin_popcount(i)!=x){continue;}longlongprod=1LL;// 计算当前组合的乘积for(intj=0;j<n;j++){// 判断二进制第 j 位是否为 1if((i&(1<<j))!=0){prod*=gems[j];}}// 4. 判断条件// 根据用例1 (目标8,输出3),这里必须是 "大于等于"// 2*4=8, 2*5=10, 4*5=20,共3种if(prod>=y){res++;}}std::cout<<res<<std::endl;return0;}

Go

package main import ( "fmt" "math/bits" ) func main() { // 1. 读取 n, x, y var n, x int var y int64 fmt.Scan(&n, &x, &y) // 2. 读取宝石属性值 gems := make([]int64, n) for i := 0; i < n; i++ { fmt.Scan(&gems[i]) } res := 0 totalStates := 1 << n // 2的n次方 // 3. 二进制枚举所有组合 for i := 0; i < totalStates; i++ { // 优化:利用 bits.OnesCount 快速判断当前组合是否选了 x 个 if bits.OnesCount(uint(i)) != x { continue } prod := int64(1) // 计算当前组合的乘积 for j := 0; j < n; j++ { // 判断二进制第 j 位是否为 1 if (i & (1 << j)) != 0 { prod *= gems[j] } } // 4. 判断条件 // 根据用例1 (目标8,输出3),这里必须是 "大于等于" // 2*4=8, 2*5=10, 4*5=20,共3种 if prod >= y { res++ } } fmt.Println(res) }

C语言

#include<stdio.h>#include<stdlib.h>intcountSetBits(intn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}intmain(){// 1. 读取 n, x, yintn,x;longlongy;scanf("%d %d %lld",&n,&x,&y);// 2. 读取宝石属性值longlong*gems=(longlong*)malloc(n*sizeof(longlong));for(inti=0;i<n;i++){scanf("%lld",&gems[i]);}intres=0;inttotalStates=1<<n;// 2的n次方// 3. 二进制枚举所有组合for(inti=0;i<totalStates;i++){// 优化:利用 countSetBits 快速判断当前组合是否选了 x 个if(countSetBits(i)!=x){continue;}longlongprod=1LL;// 计算当前组合的乘积for(intj=0;j<n;j++){// 判断二进制第 j 位是否为 1if((i&(1<<j))!=0){prod*=gems[j];}}// 4. 判断条件// 根据用例1 (目标8,输出3),这里必须是 "大于等于"// 2*4=8, 2*5=10, 4*5=20,共3种if(prod>=y){res++;}}printf("%d\n",res);free(gems);return0;}

文章目录

  • 最新华为上机考试
  • 题目描述
  • 输入描述
  • 输出描述
  • 示例1
  • 解题思路
      • 解题思路
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 11:12:33

ISIF Cloud HKG-B/HKG-C解锁(NSP)

解锁服务使用解锁服务前&#xff0c;请先将您的服务 DNS 设置为解锁服务提供的 DNS。您可手动配置&#xff0c;也可使用下方脚本一键设置。更新解锁地区后&#xff0c;请耐心等待约 10 分钟&#xff0c;服务将自动生效。DNS: 151.240.12.10Script: curl -fsSL https://run.isif…

作者头像 李华
网站建设 2026/4/16 11:00:37

基于SpringBoot的音乐舞台剧分类赏析系统毕业设计项目源码

题目简介在文化消费升级、音乐舞台剧受众群体扩大的背景下&#xff0c;传统赏析模式存在 “作品资源分散、分类标准模糊、互动交流不足” 的痛点。基于 SpringBoot 构建的音乐舞台剧分类赏析系统&#xff0c;适配管理员、艺术创作者、剧评人、普通用户等角色&#xff0c;实现作…

作者头像 李华
网站建设 2026/4/16 10:36:03

基于SpringBoot的一站式公务员备考系统的设计与实现毕业设计项目源码

题目简介在公务员考试竞争加剧、备考需求多元化的背景下&#xff0c;传统备考模式存在 “资源分散、针对性不足、进度难把控、缺乏专业指导” 的痛点。基于 SpringBoot 构建的一站式公务员备考系统&#xff0c;适配管理员、讲师、备考学员等角色&#xff0c;实现备考资源整合、…

作者头像 李华
网站建设 2026/4/16 12:52:40

基于SpringBoot的阳光超市管理系统毕业设计项目源码

题目简介在零售行业数字化升级、超市运营精细化需求提升的背景下&#xff0c;传统超市管理存在 “商品管理混乱、库存与销售脱节、会员运营薄弱” 的痛点。基于 SpringBoot 构建的阳光超市管理系统&#xff0c;适配超市管理员、采购人员、收银员、仓储人员、会员用户等角色&…

作者头像 李华
网站建设 2026/4/16 9:20:16

第十二课Open3D点云数据处理:半径-均值组合滤波

1 半径-均值组合滤波算法原理 1.1 半径滤波原理 1.2 均值滤波原理 2 代码实现 2.1 代码行实现 2.2 将半径-均值组合滤波实现封装到 pointCloud_radius_mean_filter() 函数中 1 半径-均值组合滤波算法原理 1.1 半径滤波原理 1.2 均值滤波原理 需要注意的一点是&#xff1a…

作者头像 李华
网站建设 2026/4/16 12:52:49

深度测评 8个一键生成论文工具:本科生毕业论文痛点全解析

深度测评 8个一键生成论文工具&#xff1a;本科生毕业论文痛点全解析 学术写作工具测评&#xff1a;为何需要一份靠谱的榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始依赖AI工具辅助毕业论文的撰写。然而&#xff0c;面对市场上种类繁多的一键…

作者头像 李华