转帖自hihocoder, 实现一个计算奇迹德1费OTK概率的程序:
你在玩炉石传说, 你组了一套卡牌。
拍卖师(auctioneer),随从,花费5个水晶,每释放一个法术摸一张牌。多个拍卖师同时在场上时抽牌效果可以叠加。
激活(innervate),法术,花费0个水晶,获取2个水晶。但是总水晶数目不能超过maxCrystal.
爪击(claw),法术,花费1个水晶,为英雄增加两点攻击,两点护甲。
硬币(coin),法术,花费0个水晶,获取1个水晶。但是总水晶数目不能超过maxCrystal.
然后你可以打出,拍卖师 激活 爪机 硬币,当你的总攻击超过HP的时候,你便可以击杀对方。
但是注意,场上至多同时放置7个随从。
如果当前你的牌组已经空了,但是还试图摸牌,你会受到疲劳(fatigue)惩罚。
第i次试图摸牌受到i点伤害,即如果再没有牌之后试图摸i张牌时,你一共会受到i(i + 1) / 2点伤害,当惩罚超过了HP + 护甲,你会立刻死亡。
刚开始你有1颗水晶;你的英雄和对手各有HP点生命值;你可以摸4张牌。
你可以选择其中你不想要的牌,把他们加入牌组洗牌,再抽取等量的牌(也就是说你有可能抽到放进去的牌)。
然后你摸去一张牌和一个硬币。
你可以认为牌组是均匀洗牌的。
然后问你这回合可以击杀对手(OTK, one turn kill)的概率是多少,即你的攻击力超过了对方的HP。
你的手牌上限是maxHand,当达到手牌上限之后,如果你再试图抽牌,牌会直接弃掉。
你的水晶上限是maxCrystal,当你达到水晶上限时候,再使用激活和硬币不会增加水晶。
如果你玩过炉石,注意这里并没有英雄技能变形。
Input
六个整数,分别表示拍卖师个数,激活个数,爪击个数,生命值,水晶上限,手牌上限。
总牌数小于34,生命值10到30,水晶上限和手牌上限都是5到15 。
Output
OTK概率。与标准答案误差在1e-5以内就算正确。
Sample Input 2 13 15 30 10 10
Sample Output 0.241662
你在玩炉石传说, 你组了一套卡牌。
拍卖师(auctioneer),随从,花费5个水晶,每释放一个法术摸一张牌。多个拍卖师同时在场上时抽牌效果可以叠加。
激活(innervate),法术,花费0个水晶,获取2个水晶。但是总水晶数目不能超过maxCrystal.
爪击(claw),法术,花费1个水晶,为英雄增加两点攻击,两点护甲。
硬币(coin),法术,花费0个水晶,获取1个水晶。但是总水晶数目不能超过maxCrystal.
然后你可以打出,拍卖师 激活 爪机 硬币,当你的总攻击超过HP的时候,你便可以击杀对方。
但是注意,场上至多同时放置7个随从。
如果当前你的牌组已经空了,但是还试图摸牌,你会受到疲劳(fatigue)惩罚。
第i次试图摸牌受到i点伤害,即如果再没有牌之后试图摸i张牌时,你一共会受到i(i + 1) / 2点伤害,当惩罚超过了HP + 护甲,你会立刻死亡。
刚开始你有1颗水晶;你的英雄和对手各有HP点生命值;你可以摸4张牌。
你可以选择其中你不想要的牌,把他们加入牌组洗牌,再抽取等量的牌(也就是说你有可能抽到放进去的牌)。
然后你摸去一张牌和一个硬币。
你可以认为牌组是均匀洗牌的。
然后问你这回合可以击杀对手(OTK, one turn kill)的概率是多少,即你的攻击力超过了对方的HP。
你的手牌上限是maxHand,当达到手牌上限之后,如果你再试图抽牌,牌会直接弃掉。
你的水晶上限是maxCrystal,当你达到水晶上限时候,再使用激活和硬币不会增加水晶。
如果你玩过炉石,注意这里并没有英雄技能变形。
Input
六个整数,分别表示拍卖师个数,激活个数,爪击个数,生命值,水晶上限,手牌上限。
总牌数小于34,生命值10到30,水晶上限和手牌上限都是5到15 。
Output
OTK概率。与标准答案误差在1e-5以内就算正确。
Sample Input 2 13 15 30 10 10
Sample Output 0.241662











