专栏文章

题解:P14120 [SCCPC 2021] Rock Paper Scissors

P14120题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mini3xnk
此快照首次捕获于
2025/12/02 02:47
3 个月前
此快照最后确认于
2025/12/02 02:47
3 个月前
查看原文

题目思路

理论

BaoBaoBaoBao(先手):目标是让总得分最小化,因此会在每轮选择剩余牌中,能使后续 DreamGridDreamGrid 最优应对得分最低的牌型。
DreamGridDreamGrid(后手):在 BaoBaoBaoBao 出某张牌后,会从剩余牌中选择能使本轮得分最大化的牌型应对。
双方均知晓彼此初始的三种牌(石头 rr、布 pp、剪刀 ss)数量,且每轮出牌后双方的牌都会被移除,游戏共进行 br+bp+bsb_{r} + b_{p} + b_{s}轮
规则
石头 (r)布 (p)剪刀 (s)
石头 (r)0-11
布 (p)10-1
剪刀 (s)-110

思路

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

题目代码

CPP
#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;
}
若有不足之处请多多指教,谢谢各位大佬!!

评论

0 条评论,欢迎与作者交流。

正在加载评论...