[BZOJ 3191][JLOI 2013]卡牌游戏
觉得这题很有必要讲一下!
现在发现在做概率题,基本是向 dp 和 马尔可夫链 靠齐
但是这一题真是把我坑了,因为状态太多,马式链什么的直接死了
我一开始的想法就是用 f[i][j] 表示剩余 i 个人,现由 j 坐庄
恩~ dp 方程还是老好想的嘛~
wait! wait!! wait!!! 这尼马有后效性啊!有后效性啊!!
然后想了半天毫无进展,一看题解……
哎呦我 c
其实那个方程几乎对了,但!是!有后效性就要用重标号的方法去掉!
怎么算去了呢?
其实……谁是谁更本不重要!
如果我们对每个人 i 都重标号为 0 ,列一次方程,那么每次都只算第 0 个人 (变为 0~n-1 个人) 存活的概率 即 f[1][0] 即可
所有方程的区别只在边界条件不同而已,标号什么的完全不用管,也就没有后效性了!
然后我们只要保证 0 不 over 即可,其他的都可以不用管了
若这一轮的标号是 0~i , 然后第 j 个人 over 的话
新标号为 0~i-1, 但是这里的 j~i-1 其实是原来的 j+1~i
但是我们不用去管标号变了的问题,因为本质上是一样的
f[i][(j+a[k]-1)%(i+1)]+=f[i+1][j]/M
这么写就可以了,但是还有个问题:
0 是不能被删的我们注意到在 f[i+1] -> f[i] 时
f[i][0] 其实是 0 被删去后 1 变为 0 坐庄的概率
但 0 存活到了最后,这是无法取的(事实上若 0 活到了最后,1 就不可能坐庄)
那么 f[i][0] 其实是什么呢?
f[i][i]!
因为这是一个环,在剩余 i+1 个人时,删掉了第 i 个人,在坐庄时当然由第 0 人来,这时所有人都没有被重标号
#include <cstdio>
#include <cstring>
const int sizeOfPlayer=;
const int sizeOfCard=; inline int getint(); int N, M;
int a[sizeOfCard];
double f[sizeOfPlayer][sizeOfCard]; int main()
{
N=getint(), M=getint();
for (int i=;i<M;i++)
a[i]=getint(); for (int p=;p<N;p++)
{
memset(f, , sizeof(f));
f[N][(N-p)%N]=1.0;
for (int i=N-;i;i--)
{
for (int j=;j<=i;j++)
for (int k=;k<M;k++)
f[i][(j+a[k]-)%(i+)]+=f[i+][j]/M;
f[i][]=f[i][i];
} if (p) putchar(' ');
printf("%.2lf%%", f[][]*);
} putchar('\n'); return ;
} inline int getint()
{
register int num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}
说的不清楚还请见谅
[BZOJ 3191][JLOI 2013]卡牌游戏的更多相关文章
- JLOI 2013 卡牌游戏
问题描述: N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先 ...
- JLOI 2013 卡牌游戏 bzoj3191
题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把 ...
- bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3191 每个人获胜的概率只与其在排列中与庄家的相对位置有关 dp[i][j] 还剩i个人时,从庄家数第 ...
- BZOJ 4392 卡牌游戏
Description 奶牛贝茜是卡牌游戏的狂热爱好者, 但是令人吃惊的, 她缺乏对手. 不幸的是, 任何牧 群里的其他牛都不是好对手. 他们实在是太差了 , 实际上, 他们玩卡牌游戏时会遵循一种完全 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- BZOJ_3191_[JLOI2013]卡牌游戏_概率DP
BZOJ_3191_[JLOI2013]卡牌游戏_概率DP Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随 ...
- 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告
P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...
- 【BZOJ3191】【JLOI2013】卡牌游戏 [DP]
卡牌游戏 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description N个人坐成一圈玩游戏.一开始我 ...
- TCG卡牌游戏研究:《炉石战记:魔兽英雄传》所做的改变
转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与< ...
随机推荐
- TreeMap 的实现
TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 Tre ...
- java异常架构图 和几个面试题
1.java异常架构图 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被 ...
- 用springMVC构建restful程序,接收以及返回json数据格式
主要参考文章:http://kingxss.iteye.com/blog/1487745和http://blog.csdn.net/greensurfer/article/details/192962 ...
- Meta标签中的viewport属性及含义
一.什么是Viewport 手机浏览器是把页面放在一个虚拟的"窗口"(viewport)中,通常这个虚拟的"窗口"(viewport)比屏幕宽,这样就不用把每个 ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- software_testing_work3_question2
package com.Phantom; import java.rmi.server.Operation; import java.util.Scanner; public class Work3_ ...
- js去空格
写成类的方法格式如下:(str.trim();) <script language="javascript"> String.prototype.trim=functi ...
- jQuery学习总结
1:jQuery是什么 jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库,兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, O ...
- IOS OC 多任务定时器 NSRunLoop 管理 NSTimer
下面有两种做法 1.使用日期组件 NSDateComponents 2.使用NSString 生成一个日期 // 创建一个日历对象 NSCalendar *calendar = [NSCalenda ...
- (转)C#实现MD5加密
首先,先简单介绍一下MD5 MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和r ...