#P14681. [Bulgarian2022]Poker
[Bulgarian2022]Poker
题目类型
本题为 output only 题。
你和出题人正在玩一个简化版扑克游戏。牌堆中共有 张牌,牌面数字为 到 。发牌员会从中随机给你和出题人各发一张牌,你们都只能看到自己的牌。
随后,发牌员向底池中放入 个筹码作为 ante。接下来轮到先手玩家行动,先手有可能是你,也有可能是出题人,这一点是随机决定的。
先手玩家可以:
check(过牌)bet(下注) 个筹码
如果先手选择了 check,则后手玩家也有同样两个选项:
checkbet个筹码
如果双方都 check,则游戏立即结束,双方亮牌,牌面较大者赢得底池(即 ante)。
如果某一方进行了 bet,则另一方随后行动,此时可选:
fold(弃牌)call(跟注) 个筹码
若其选择 fold,则下注者赢得当前整个底池(即 ante 加上自己的下注)。若其选择 call,则双方亮牌,牌面较大者赢得底池(即 ante 加上双方的下注)。游戏在两种情况下都会结束。
你的目标是,在大量重复游戏中,使自己平均赢得的筹码数尽可能大。为此,你需要根据:
- 自己手中的牌;
- 当前所处的局面;
来设计一套策略。
局面一共分为四种:
open:你是先手;check:你是后手,且出题人在其回合选择了check;bet:你是后手,且出题人在其回合选择了bet;check-bet:你是先手,且你先前选择了check,随后出题人选择了bet。
对于每一种“牌面 + 局面”的组合,你都要指定自己的行动。
你的策略不一定必须是确定性的。例如,你可以规定:某个状态下以 的概率下注、以 的概率过牌。需要注意的是:出题人会知道你的完整策略,并且会针对它采取最优应对。
给定若干组不同参数的游戏(即不同的 ),你需要分别设计策略,并把策略写成文本文件提交。也就是说,本题属于 output only 类型。
策略文件格式
你的策略文件必须包含 行非空行,每行描述某个“牌面 + 局面”组合下的行为。各行顺序任意,但不能遗漏,也不能重复。
每一行格式如下:
card situation: action (probability)
其中:
card是 到 的某个整数;situation取值为open、check、bet、check-bet;- 在
open与check情况下,action只能是check或bet; - 在
bet与check-bet情况下,action只能是fold或call。
若未写概率,则默认概率为 ,表示该动作总是发生。
若写了概率 ,则表示采取所写动作的概率为 ,采取相反动作的概率为 。
例如:
2 open: check 0.7
表示:当你手里是 2 且你先手时,有 的概率过牌、 的概率下注。
同理,“当我手里是 5,且作为后手面对对方下注时总是跟注”可以写成以下任意一种形式:
5 bet: call
5 bet: call 1
5 bet: fold 0
数据范围
测试与提交方式
系统提供了 个测试点的输入数据。每个测试点输入一行,包含 三个整数。
你需要上传一个 ZIP 压缩包,其中包含你为若干测试点准备好的输出文件(不要求所有测试点都提供)。
每个输出文件名必须形如:
poker.0x.out
其中 x 替换为对应测试点编号。
例如,测试点 5 的输出文件名必须为:
poker.05.out
每次上传一个 ZIP 压缩包都算作一次提交,无论压缩包中包含多少个输出文件。
评分方式
每个测试点单独评分。
- 若你的策略文件存在语法错误,则该测试点得分为 ;
- 若策略文件合法,则出题人会计算针对你策略的最优对抗方式,并求出你在这种对抗下的平均盈利,记为 。
该测试点得分比例为:
$$\min\left(\max\left(\left(\frac{200E}{99A}\right)^5, 0\right), 1\right)$$样例策略
输入
2 2 1
一组合法策略
1 open: check
1 check: bet 0.5
1 bet: fold
1 check-bet: fold 0.9
2 open: bet 0.8
2 check: bet
2 bet: call
2 check-bet: call 0.8
样例说明
下面给出一局基于上述策略的示例对局(从你的视角描述)。设 ante 为 2。
- 你拿到的是
1,并且你是先手; - 你选择
check; - 出题人下注
1个筹码; - 你选择
call(这件事发生的概率仅为 ); - 出题人手里是
2,因此他赢下此时共计 个筹码的底池。
在这一局中,你亏损了 个筹码。