题目链接:https://codeforces.com/contest/2278/problem/B
题面大意:爱丽丝会出 x 次石头、`y` 次剪刀、`z` 次布,但鲍勃不知道她的出拳顺序。鲍勃必须在游戏开始前一次性确定自己的 x+y+z 次出拳。要求构造这组出拳,使得无论爱丽丝怎样排列这三类出拳,最终:鲍勃赢的回合数 >= 爱丽丝赢的回合数,题目保证这样的出拳序列一定存在。
题目思路:由于爱丽丝的石头,剪刀,布各个出拳次数都是固定的,但是不知道顺序,那么我们可以找到当前爱丽丝出拳最多的是哪一个,如果说是剪刀有y次并且最多,我们可以让鲍勃全部出石头,那么减去剪刀对应的石头,此时鲍勃就胜利了y次,现在还有x+z次石头,可以知道爱丽丝有x次石头,抵消之后鲍勃还有z次布,并且这x次都是平局,而z次必然是爱丽丝获胜的,其中z<=y,那么鲍勃的最终结果一定是大于等于爱丽丝的获胜次数的,其他情况同理
时间复杂度:O(1)
代码如下:
#include <bits/stdc++.h> using namespace std; #define endl "\n" using ll = long long; using ld = long double; /* https://codeforces.com/contest/2278/problem/B Div.3 CF 1131B题(构造,贪心) 题面大意:爱丽丝会出 x 次石头、`y` 次剪刀、`z` 次布,但鲍勃不知道她的出拳顺序。 鲍勃必须在游戏开始前一次性确定自己的 x+y+z 次出拳。要求构造这组出拳,使得无论爱丽丝怎样排列这三类出拳,最终: 鲍勃赢的回合数 >= 爱丽丝赢的回合数,题目保证这样的出拳序列一定存在。 题目思路:由于爱丽丝的石头,剪刀,布各个出拳次数都是固定的,但是不知道顺序,那么我们可以找到当前爱丽丝出拳最多的是哪一个, 如果说是剪刀有y次并且最多,我们可以让鲍勃全部出石头,那么减去剪刀对应的石头,此时鲍勃就胜利了y次,现在还有x+z次石头, 可以知道爱丽丝有x次石头,抵消之后鲍勃还有z次布,并且这x次都是平局,而z次必然是爱丽丝获胜的, 其中z<=y,那么鲍勃的最终结果一定是大于等于爱丽丝的获胜次数的,其他情况同理 时间复杂度:O(1) */ void solve() { int x, y, z; cin >> x >> y >> z; // 石头 剪刀 布 R S P int n = x + y + z; int mx = max({x, y, z});//找到次数最多的出拳类型 if (mx == x)//如果是石头就出布 { for (int i = 0; i < n; i++) { cout << "P"; } } else if (mx == y)//如果是剪刀就出石头 { for (int i = 0; i < n; i++) { cout << "R"; } } else//如果是布就出剪刀 { for (int i = 0; i < n; i++) { cout << "S"; } } cout << endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { solve(); } return 0; }