对比直接使用官方API体验Taotoken在计费透明度上的优势
2026/5/6 9:25:20
2025华为OD机试双机位B卷 - 华为OD上机考试双机位B卷 100分题型
华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解
游乐园有一款互动游戏,游戏开始时会提供n个宝石,每个宝石都一个属性值a1,a2,…an.玩家在游戏前可以挑选x颗宝石,将这些宝石的属性值相乘组成玩家的属性值。游戏玩家需要y点属性值,请帮助游戏玩家计算有多少种计算方式。
第一行:三个整数n,x,y
第二行:n个整数,a1,a2,…an(-100 < ai < 100),表示每个宝石的属性值。
输出一个整数,表示玩家可以通过游戏的挑选方式的数量。
4 2 8 2 -3 4 53思路:二进制枚举
n < 20数据量对应2^20比较小,可以采用二进制暴力枚举判断。101表示会选中第1和第3个宝石position保存position的数量是否等于x,不等于直接跳过。y,大于y的话直接结果+1。这里a的值范围比较大,非python用户尽量使用大的数据类型进行保存,防止溢出#include <stdio.h> int main() { int n, x; long long y; scanf("%d %d %lld", &n, &x, &y); int ans[25]; // 假设 n 不会太大(<=20 很常见) for (int i = 0; i < n; i++) { scanf("%d", &ans[i]); } int res = 0; // 枚举所有非空子集 for (int mask = 1; mask < (1 << n); mask++) { int cnt = 0; // 已选元素个数 long long product = 1; // 当前乘积 for (int i = 0; i < n; i++) { // 判断第 i 位是否被选中 if (mask & (1 << i)) { cnt++; // 超过 x 个,直接剪枝 if (cnt > x) { break; } product *= ans[i]; } } // 必须刚好选 x 个 if (cnt == x && product >= y) { res++; } } printf("%d\n", res); return 0; }本题包含其它多语言实现,可以点击跳转实现:华为OD机试双机位C卷 - 挑选宝石 (C++ & Python & JAVA & JS & GO)