Codeforces Round 926 (Div. 2) C. Sasha and the Casino (博弈论*1400)

在这里插入图片描述
在这里插入图片描述
这里的意思是想让我们求得是否是能够实现不停地无上限的赚钱。

这里注意避开一个思维误区,如果你想的是前x次一直用1枚硬币然后吃第x+1次保底,那么就是错误的。你应该考虑到如果前x次里面出现了胜利呢?这时候你拿着一枚硬币根本赚不回本。

所以我们要假定:前x+1次,每一次都有可能胜利,并且每次胜利我们都需要使得自己能够赚回本金并且获得利润。
那么我们要怎么做才能够实现?

这里假设我们第i次投入的硬币数量为 C i C_i Ci,那么在投入m次之后,如果现在我们恰巧胜利了,那么我们需要赚回的硬币至少要大于: ∑ i = 1 m − 1 C i \sum_{i = 1}^{m-1} C_i i=1m1Ci

而当前我们投入的硬币是 C m C_m Cm,那么我们就可以得到: C m ∗ ( k − 1 ) > ∑ i = 1 m − 1 C i C_m*(k - 1) > \sum_{i = 1}^{m-1} C_i Cm(k1)>i=1m1Ci
就可以知道 C m > ∑ i = 1 m − 1 C i k − 1 C_m > \frac{\sum_{i = 1}^{m-1} C_i}{k-1} Cm>k1i=1m1Ci

而这个m就代表了前x+1次里面的每一次我们都要这么计算,只需要维护一个前缀和变量就可以了,如果到x+1中间出现了花费大于本金,那么就一定没办法一直赚钱。

void solve(){
    int k,x,a;cin >> k >> x >> a;

    int s = 0;
    for(int i = 1;i <= x + 1;i++){
        s += s/(k - 1) + 1;
        if(s > a){
            cout << "NO\n";
            return;
        }
    }
    cout << "YES\n";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值