#P14681. [Bulgarian2022]Poker

[Bulgarian2022]Poker

题目类型

本题为 output only 题。

你和出题人正在玩一个简化版扑克游戏。牌堆中共有 NN 张牌,牌面数字为 11NN。发牌员会从中随机给你和出题人各发一张牌,你们都只能看到自己的牌。

随后,发牌员向底池中放入 AA 个筹码作为 ante。接下来轮到先手玩家行动,先手有可能是你,也有可能是出题人,这一点是随机决定的。

先手玩家可以:

  • check(过牌)
  • bet(下注)BB 个筹码

如果先手选择了 check,则后手玩家也有同样两个选项:

  • check
  • bet BB 个筹码

如果双方都 check,则游戏立即结束,双方亮牌,牌面较大者赢得底池(即 ante)。

如果某一方进行了 bet,则另一方随后行动,此时可选:

  • fold(弃牌)
  • call(跟注)BB 个筹码

若其选择 fold,则下注者赢得当前整个底池(即 ante 加上自己的下注)。若其选择 call,则双方亮牌,牌面较大者赢得底池(即 ante 加上双方的下注)。游戏在两种情况下都会结束。

你的目标是,在大量重复游戏中,使自己平均赢得的筹码数尽可能大。为此,你需要根据:

  • 自己手中的牌;
  • 当前所处的局面;

来设计一套策略。

局面一共分为四种:

  • open:你是先手;
  • check:你是后手,且出题人在其回合选择了 check
  • bet:你是后手,且出题人在其回合选择了 bet
  • check-bet:你是先手,且你先前选择了 check,随后出题人选择了 bet

对于每一种“牌面 + 局面”的组合,你都要指定自己的行动。

你的策略不一定必须是确定性的。例如,你可以规定:某个状态下以 2/32/3 的概率下注、以 1/31/3 的概率过牌。需要注意的是:出题人会知道你的完整策略,并且会针对它采取最优应对。

给定若干组不同参数的游戏(即不同的 N,A,BN,A,B),你需要分别设计策略,并把策略写成文本文件提交。也就是说,本题属于 output only 类型。

策略文件格式

你的策略文件必须包含 4N4N 行非空行,每行描述某个“牌面 + 局面”组合下的行为。各行顺序任意,但不能遗漏,也不能重复。

每一行格式如下:

card situation: action (probability)

其中:

  • card11NN 的某个整数;
  • situation 取值为 opencheckbetcheck-bet
  • opencheck 情况下,action 只能是 checkbet
  • betcheck-bet 情况下,action 只能是 foldcall

若未写概率,则默认概率为 11,表示该动作总是发生。
若写了概率 pp,则表示采取所写动作的概率为 pp,采取相反动作的概率为 1p1-p

例如:

2 open: check 0.7

表示:当你手里是 2 且你先手时,有 70%70\% 的概率过牌、30%30\% 的概率下注。

同理,“当我手里是 5,且作为后手面对对方下注时总是跟注”可以写成以下任意一种形式:

5 bet: call
5 bet: call 1
5 bet: fold 0

数据范围

2N502 \le N \le 50 1A,B201 \le A,B \le 20

测试与提交方式

系统提供了 88 个测试点的输入数据。每个测试点输入一行,包含 N,A,BN,A,B 三个整数。

你需要上传一个 ZIP 压缩包,其中包含你为若干测试点准备好的输出文件(不要求所有测试点都提供)。

每个输出文件名必须形如:

poker.0x.out

其中 x 替换为对应测试点编号。
例如,测试点 5 的输出文件名必须为:

poker.05.out

每次上传一个 ZIP 压缩包都算作一次提交,无论压缩包中包含多少个输出文件。

评分方式

每个测试点单独评分。

  • 若你的策略文件存在语法错误,则该测试点得分为 00
  • 若策略文件合法,则出题人会计算针对你策略的最优对抗方式,并求出你在这种对抗下的平均盈利,记为 EE

该测试点得分比例为:

$$\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(这件事发生的概率仅为 10%10\%);
  • 出题人手里是 2,因此他赢下此时共计 44 个筹码的底池。

在这一局中,你亏损了 11 个筹码。