题解:P14120 [SCCPC 2021] Rock Paper Scissors

· · 题解

题目思路

理论

$DreamGrid$(后手):在 $BaoBao$ 出某张牌后,会从剩余牌中选择能使本轮得分最大化的牌型应对。 双方均知晓彼此初始的三种牌(石头 $r$、布 $p$、剪刀 $s$)数量,且每轮出牌后双方的牌都会被移除,游戏共进行 $b_{r} + b_{p} + b_{s}轮

规则

石头 (r) 布 (p) 剪刀 (s)
石头 (r) 0 -1 1
布 (p) 1 0 -1
剪刀 (s) -1 1 0

思路

计算时先求每种正得分对抗的最大可能次数(取双方对应牌数最小值),累加得正分总和;再算负得分对抗(得 -1 分的 3 种情况)的最小可能次数,累加得负分总和。总得分即正分与负分之和,此贪心策略契合双方最优目标,且能高效处理大数据。

题目代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main()
{    
    int T;
    cin>>T;
    while(T--)
    {
        int br,bp,bs;
        cin>>br>>bp>>bs;
        int dr,dp,ds;
        cin>>dr>>dp>>ds;
        int a=min(br,dp);//Dp vs Br(得1分)
        br-=a;
        dp-=a; 
        int b=min(bp, ds);//Ds vs Bp (得1分)
        bp-=b;ds-=b;
        int c=min(bs,dr);//Dr vs Bs (得1分)
        bs-=c;
        dr-=c;
        int sum=a+b+c;
        int d=min(bp,dr)//Dr vs Bp (得-1分)
        int e=min(bs,dp);//Dp vs Bs (得-1分)
        int f=min(br,ds);//Ds vs Br (得-1分)
        int sum1=-(d+e+f)
        cout<<sum+sum1<<"\n";
    }
    return 0;
}

若有不足之处请多多指教,谢谢各位大佬!!