1 条题解
-
0
题意分析
题目描述了一种巴比伦人玩的特殊轮盘赌游戏,规则如下:
- 轮盘标签:轮盘有六个标签,分别为 、、、、、。
- 游戏流程:
- 游戏按轮次进行,每轮编号为 。
- 每名玩家只能参与一次,转动轮盘后根据标签 获得或损失 。
- 奖池金额更新规则:。
- 如果 ,玩家只能赢得不导致奖池为负的最大金额。
- 如果某轮 ,游戏立即结束;否则持续到日落。
- 输入:每组数据包含三个整数 (初始奖池)、(赌注)、(最终奖池)。
- 输出:
- 如果无法通过合法游戏轮次得到 ,输出
No accounting tablet
。 - 否则输出最小玩家数量。
- 如果无法通过合法游戏轮次得到 ,输出
解题思路
-
数学建模:
- 设玩家轮次结果为 ,则最终奖池应满足:$$P_{\text{final}} = P_0 + \text{bet} \cdot \sum_{i=1}^k L_i $$
- 需要找到一组 ,使得总和 是整数,且游戏过程中奖池始终合法。
-
关键约束:
- 整除性: 必须能被 整除,否则无解。
- 奖池非负:每轮结束后奖池 。
- 游戏终止条件:若某轮 ,游戏结束,后续轮次无法进行。
-
贪心策略:
- 最小化玩家数量 ,即让 尽可能大。
- 对 的绝对值 ,用最少的 凑出,优先选 或 。
-
合法性验证:
- 模拟每轮奖池变化,确保 或游戏结束。
算法步骤
- 检查整除性:
- 计算 ,若不为整数,直接无解。
- 计算最小轮次:
- (用最少的高倍数标签凑出 )。
- 模拟奖池变化:
- 初始化当前奖池 。
- 按贪心策略依次选择标签 ( 或 ),更新 并检查合法性:
- 若 ,则调整 为最大可能值。
- 若 ,终止并检查是否已达成 。
标程
#include <iostream> using namespace std; int main() { int pot; int bet; int fpot; while (cin >> pot >> bet >> fpot, pot + bet + fpot) { if (pot > fpot) pot -= fpot; else pot = fpot - pot; if (pot % bet != 0) cout << "No accounting tablet" << endl; else { pot = pot / bet; int ans = 0; ans += pot / 3; pot %= 3; ans += pot / 2; pot %= 2; ans += pot; cout << ans << endl; } } return 0; }
- 1
信息
- ID
- 2197
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者