SPOJ 4060 A game with probability
博弈论+dp+概率
提交链接-
题意不是很好懂
Ai 表示剩 i 个石头、 A 先手的获胜概率。
Bi 表示剩 i 个石头、 B先手的获胜概率。
如果想选,对于 Ai:
有 p 的概率进入 Bi−1 ;有 1−p 的概率进入 Bi
所以 fi=p∗Bi−1+(1−p)∗Bi
如果想选,对于 Bi:
有 q 的概率进入 Ai−1 ;有 1−q 的概率进入 Ai
所以 gi=q∗Ai−1+(1−q)∗Ai
如果不想选, 把 p 变成 1 - p, q 变成 1 - q 即可
为了满足递推关系,我们把 Bi 带入到 Ai 的式子中,
整理得:
Ai=(p∗Bi-1 +(1−p)∗q∗Ai-1 )/(1-(1−p)∗(1−q))
Bi=(q∗Ai-1+(1−q)∗p∗Bi−1)/(1−(1−p)∗(1−q))
然后剩 i 个石头时A的想不想选的意愿与 Ai−1、Ai−1 的大小关系有关。
Ai−1>Bi−1 都不想选。
因为 A 如果选了,就到了 Bi - 1,获胜概率就小了
如果 B 选了, 就到了 Ai - 1, A的获胜概率就大了,B 的获胜概率就小了
Bi−1<Bi−1 都想选。
同理
然后对于不想选的情况,那么 p=1−p,q=1−q 就行了。
然而这样就没法用矩阵乘法了。。。
就需要黑科技,,当n很大时,其实概率已经基本不动了,,让n=min(n,1000)就好了.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int init() {
int rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh * rv;
}
int T, n;
double a[1005], b[1005], p, q;
int main() {
T = init();
while(T--) {
n = init();
n = min(n, 1000);
scanf("%lf%lf", &p, &q);
a[0] = 0.0; b[0] = 1.0;
for(int i = 1 ; i <= n ; i++) {
if(a[i - 1] > b[i - 1]) {p = 1 - p; q = 1 - q;}
a[i] = p / (1 - (1 - p) * (1 - q)) * b[i - 1] +
(1 - p) * q / (1 - (1 - p) * (1 - q)) * a[i - 1];
b[i] = q / (1 - (1 - p) * (1 - q)) * a[i - 1] +
(1 - q) * p / (1 - (1 - p) * (1 - q)) * b[i - 1];
if(a[i - 1] > b[i - 1]) {p = 1 - p; q = 1 - q;}
}
printf("%.6lf\n",a[n]);
}
return 0;
}
SPOJ 4060 A game with probability的更多相关文章
- SPOJ 375. Query on a tree (树链剖分)
Query on a tree Time Limit: 5000ms Memory Limit: 262144KB This problem will be judged on SPOJ. Ori ...
- Project Euler 100 : Arranged probability 安排概率
Arranged probability If a box contains twenty-one coloured discs, composed of fifteen blue discs and ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- SPOJ GSS3 Can you answer these queries III[线段树]
SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...
- 【BZOJ2318】Spoj4060 game with probability Problem 概率
[BZOJ2318]Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- SPOJ bsubstr
题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...
- Fuzzy Probability Theory---(3)Discrete Random Variables
We start with the fuzzy binomial. Then we discuss the fuzzy Poisson probability mass function. Fuzzy ...
随机推荐
- CloudFoundry命令行和Kubernetes命令行的Restful API消费方式
先说CloudFoundry的命令行工具CLI.我们在CloudFoundry环境下工作,第一个使用的命令就是cf login. 如果在环境变量里维护CF_TRACE的值为true: 则我们能发现,诸 ...
- VC-基础:VC中得到当前系统的时间和日期
得到当前时间的方法一般都是得到从1900年0点0分到现在的秒数,然后转为年月日时分秒的形式得到当前的时间(时分秒).主要方法如下: 1)使用CRT函数 C++代码 ]; time_t nowtim ...
- cdlinux
xset q xset s 6000 xset -dpms ntpdate time.nist.gov date
- PAT (Basic Level) Practise (中文)-1029. 旧键盘(20)
PAT (Basic Level) Practise (中文)-1029. 旧键盘(20) http://www.patest.cn/contests/pat-b-practise/1029 旧键盘上 ...
- Bootstrap 网格系统(Grid System)实例2
Bootstrap 网格系统(Grid System):堆叠水平,两种样式 <!DOCTYPE html><html><head><meta http-equ ...
- ios设备屏幕尺寸与分辨率
iOS 设备的屏幕尺寸.分辨率及其屏幕边长比例详细情况是怎样的? 根据屏幕尺寸和分辨率,ios现在数起来有6个版本.一,3GS:二,4s为代表:三,iphone5:四,ipad2为代表:五,ipad4 ...
- ios之UIScrollView
UIScrollView 类负责所有基于 UIKit 的滚动操作. 一.创建 [java] view plaincopy CGRect bounds = [ [ UIScreen mainSc ...
- ios之UIButoon
第一.UIButton的定义 UIButton *button=[[UIButton buttonWithType:(UIButtonType); 能够定义的button类型有以下6种, typede ...
- js转换金钱为中文单位元、万元、亿元、万亿
function unitConvert(num) { var moneyUnits = ["元", "万元", "亿元", "万 ...
- Python操作微信跳一跳
“跳一跳”这个东西还是今天刚接触到的,看到了python群中有人再问“微信跳一跳的外挂有人写了没”,“早就有了”,“github”,“等着出个更详细的教程教程没看懂,主要没有用过adb”. 不过没关系 ...