bzoj2318 Spoj4060 game with probability Problem

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2318

【题解】

令f[i]表示剩i个石子,A先手赢的概率;g[i]表示剩i个石子,A后手赢的概率。

如果想选的话,f[i]可以通过g[i-1]和g[i]转移来,系数推推即可。同理g[i]可以通过f[i-1]和f[i]转移来。

然后这是两个方程,我们要求解的是f[i]和g[i],解方程 化简即可。

考虑如果f[i-1]<g[i-1]也就是说后手比较优,那么A想让石头来到i-1,这样就出现了i-1石头,B先手A后手,比较优,所以都想选。

反之都不想选。

直接转移即可,复杂度O(Tn)。

考虑复杂度太大,加上打表打表可以知道,当n很大的时候,f和g基本不变,我们设定阈值10w,超过就当做10w做即可。

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + 10;
const int mod = 1e9+7;

# define RG register
# define ST static

int T, n;
double p, q;
double f[M], g[M];
// 剩i个石子,A先手赢的概率
// 剩i个石子,A后手赢的概率 

inline void sol() {
    cin >> n >> p >> q;
    f[0] = 0.0, g[0] = 1.0; 
    for (int i=1; i<=n && i<=100000; ++i) {
        if(f[i-1] <= g[i-1]) {
            f[i] = ((1.0-p) * q * f[i-1] + p * g[i-1]) / (1.0-(1-p)*(1-q)); 
            g[i] = ((1.0-q) * p * g[i-1] + q * f[i-1]) / (1.0-(1-p)*(1-q));
        } else {
             f[i] = (p * (1.0-q) * f[i-1] + (1.0-p) * g[i-1]) / (1.0-p*q);
            g[i] = (q * (1.0-p) * g[i-1] + (1.0-q) * f[i-1]) / (1.0-p*q);
        }
    }
    printf("%.6lf\n", f[(n > 100000) ? 100000 : n]); 
}

int main() {
    cin >> T;
    while(T--) sol();
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/galaxies/p/bzoj2318.html

BZOJ 2908 题目是一个数据下载任务。这个任务要求下载指定的数据文件,并统计文件中小于等于给定整数的数字个数。 为了完成这个任务,首先需要选择一个合适的网址来下载文件。我们可以使用一个网络爬虫库,如Python中的Requests库,来帮助我们完成文件下载的操作。 首先,我们需要使用Requests库中的get()方法来访问目标网址,并将目标文件下载到我们的本地计算机中。可以使用以下代码实现文件下载: ```python import requests url = '目标文件的网址' response = requests.get(url) with open('本地保存文件的路径', 'wb') as file: file.write(response.content) ``` 下载完成后,我们可以使用Python内置的open()函数打开已下载的文件,并按行读取文件内容。可以使用以下代码实现文件内容读取: ```python count = 0 with open('本地保存文件的路径', 'r') as file: for line in file: # 在这里实现对每一行数据的判断 # 如果小于等于给定整数,count 加 1 # 否则,不进行任何操作 ``` 在每一行的处理过程中,我们可以使用split()方法将一行数据分割成多个字符串,并使用int()函数将其转换为整数。然后,我们可以将该整数与给定整数进行比较,以判断是否小于等于给定整数。 最后,我们可以将统计结果打印出来,以满足题目的要求。 综上所述,以上是关于解决 BZOJ 2908 数据下载任务的简要步骤和代码实现。 希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值