题目链接
思路:
他想知道自己是否可以赢取尽量多的数量的硬币。即他要采取措施让自己的硬币在任何情况下(不会连输超过x次)都要不断增多。
即我们考虑第一次,第二次,,,第x次,每一次都有赢和输的两种可能,每一次要赌多少硬币呢?我们不管这一次输多少,但是要保证这一次如果赢的话,要使硬币量大于原始的a,用二分判断出这一次最少要赌的硬币量,如果这一次输了就进入下一次,一共不会超过x次。
代码:
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<PII, int> PIII;
const int inf = 0x3f3f3f3f;
const ll infinf = 0x3f3f3f3f3f3f3f3f;//const int N = void solve() {ll k, x, a; cin >> k >> x >> a;ll tmp = a;for (ll i = 1; i <= x; i ++) {ll l = 1, r = a;while (l < r) {ll mid = (l + r) / 2;if (a - mid + k * mid > tmp) r = mid;else l = mid + 1;}if (a <= l) { // 如果剩下的硬币不够了, 输出NOcout << "NO" << endl;return;} else {a -= l; // 输掉, 进入下一轮if (i == x) { // 最后一轮, 则下一次必赢, 直接将剩下的硬币全赌进去, 得 k * a个a *= k;if (a > tmp) cout << "YES" << endl; // 如果硬币量大于原始的a, 则YESelse cout << "NO" << endl;}}}
}int main() {ios::sync_with_stdio(false);cin.tie(0);int t; cin >> t;while (t --) solve();return 0;
}