1 条题解

  • 0
    @ 2025-5-26 7:40:16

    题意分析

    题目描述了一种巴比伦人玩的特殊轮盘赌游戏,规则如下:

    1. 轮盘标签:轮盘有六个标签,分别为 1-12-23-3112233
    2. 游戏流程
      • 游戏按轮次进行,每轮编号为 0,1,2,0, 1, 2, \ldots
      • 每名玩家只能参与一次,转动轮盘后根据标签 LL 获得或损失 wt=L×赌注w_t = L \times \text{赌注}
      • 奖池金额更新规则:Pt+1=Pt+wtP_{t+1} = P_t + w_t
      • 如果 Pt+1<0P_{t+1} < 0,玩家只能赢得不导致奖池为负的最大金额。
      • 如果某轮 Pt<赌注P_t < \text{赌注},游戏立即结束;否则持续到日落。
    3. 输入:每组数据包含三个整数 P0P_0(初始奖池)、bet\text{bet}(赌注)、PfinalP_{\text{final}}(最终奖池)。
    4. 输出
      • 如果无法通过合法游戏轮次得到 PfinalP_{\text{final}},输出 No accounting tablet
      • 否则输出最小玩家数量。

    解题思路

    1. 数学建模

      • 设玩家轮次结果为 L1,L2,,LkL_1, L_2, \ldots, L_k,则最终奖池应满足:$$P_{\text{final}} = P_0 + \text{bet} \cdot \sum_{i=1}^k L_i $$
      • 需要找到一组 Li{3,2,1,1,2,3}L_i \in \{-3, -2, -1, 1, 2, 3\},使得总和 S=PfinalP0betS = \frac{P_{\text{final}} - P_0}{\text{bet}} 是整数,且游戏过程中奖池始终合法。
    2. 关键约束

      • 整除性(PfinalP0)(P_{\text{final}} - P_0) 必须能被 bet\text{bet} 整除,否则无解。
      • 奖池非负:每轮结束后奖池 Pt0P_t \geq 0
      • 游戏终止条件:若某轮 Pt<betP_t < \text{bet},游戏结束,后续轮次无法进行。
    3. 贪心策略

      • 最小化玩家数量 kk,即让 Li|L_i| 尽可能大。
      • SS 的绝对值 S|S|,用最少的 LiL_i 凑出,优先选 333-3
    4. 合法性验证

      • 模拟每轮奖池变化,确保 PtbetP_t \geq \text{bet} 或游戏结束。

    算法步骤

    1. 检查整除性
      • 计算 S=PfinalP0betS = \frac{P_{\text{final}} - P_0}{\text{bet}},若不为整数,直接无解。
    2. 计算最小轮次
      • kmin=S/3k_{\text{min}} = \lceil |S| / 3 \rceil(用最少的高倍数标签凑出 SS)。
    3. 模拟奖池变化
      • 初始化当前奖池 P=P0P = P_0
      • 按贪心策略依次选择标签 LiL_i333-3),更新 PP 并检查合法性:
        • P+Libet<0P + L_i \cdot \text{bet} < 0,则调整 LiL_i 为最大可能值。
        • P<betP < \text{bet},终止并检查是否已达成 PfinalP_{\text{final}}

    标程

    #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
    上传者