题解:CF2278B Stakes and Shapes

· · 题解

题目大意

Alice 和 Bob 进行石头剪刀布游戏,一共进行 x+y+z 局。

Alice 的出拳情况是已知的:她会出 x 次石头,y 次剪刀,z 次布,但 Bob 不知道具体的出拳顺序,Bob 需要提前安排好他所有的出拳。

要求无论 Alice 的出拳顺序如何,Bob 赢的局数都必须大于等于输的局数。求一种合法的 Bob 的出拳方案。

思路分析

既然 Bob 不知道 Alice 的出拳顺序,不妨试试全出一样的拳,得出答案就变成已知的了。

以 Bob 全程出布为例:

因为平局次数不影响结果,观察 x 和 y 不难发现:只要满足 x \ge y,Bob 就能保证不输。而其他情况也是如此:y \ge z 时全程出石头,z \ge x 时全程出剪刀,这里就不再一一证明了。

::::info[解的存在] 为什么一定存在解?

因为这三个条件 x \ge y、y \ge z、z \ge x 中,必定至少有一个成立。如果都不成立,就会得出 x < y 且 y < z 且 z < x,即 x < x,这显然是矛盾的。

因此,只需要判断这三个条件哪个成立,然后输出对应长度的字符串即可。

代码

照上述过程模拟即可。

#include <bits/stdc++.h>
using namespace std;
int main() {
    int t;
    cin>>t;
    while(t--) {
        int x,y,z;
        cin>>x>>y>>z;
        if(x>=y) cout<<string(x+y+z,'P')<<'\n';
        else if(y>=z) cout<<string(x+y+z,'R')<<'\n';
        else cout<<string(x+y+z,'S')<<'\n';
    }
}

~点个赞吧~