【Codeforces 98E】Help Shrek and Donkey

26 篇文章 0 订阅
3 篇文章 0 订阅

题目描述

A君有 n 张牌,B君有m张牌,桌上还有一张反扣着的牌,每张牌都不一样。

每个回合可以做两件事中的一件

  • 猜测桌上的牌是什么,猜对则胜,猜败则输。
  • 询问对方是否有某张牌,若有则需要将其示出,否则继续游戏。

A和B都很聪明,问A的胜率。

n,m<5000


分析

首先不到最后一刻是不会选择猜桌上的牌的。
假如某一次对方问了一张自己手上没有的牌,就可能会怀疑桌上的牌就是这张。
而询问对方是否有某张牌,我们可以选择询问自己手上有的牌,假如对方相信而去猜测这张牌的话就会输掉,我们称这样的行为作欺骗。
f(n,m) 表示先手有 n 张牌,后手有m张牌,先手的获胜概率。
那么就可以列一个表格,表示先手的选择以及后手的应对。

  • 先手选择猜测对方的牌
    • 后手认为先手在猜测,先手获胜的概率是 mm+1(1f(m1,n))
    • 后手认为先手在欺骗,先手获胜的概率是 1m+1+mm+1(1f(m1,n))
  • 先手选择欺骗
    • 后手认为先手在猜测,先手获胜的概率是 1
    • 后手认为先手在欺骗,先手获胜的概率是1f(n1,m)

那么对于先手的任意一个策略,后手会选择最优的策略去使他输。也就是说假如先手用 p 的概率选择去猜测,1p的概率选择去欺骗。
那么最终贡献的概率是

maxpmin{pmm+1(1f(m1,n))+(1p),pm+1+pmm+1(1f(m1,n))+(1p)(1f(n1,m))}

p 视为自变量,问题就转化为两条直线取min的问题,求个交点就可以得到最大值。

时间复杂度 O(nm)
空间复杂度 O(nm)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值