当前位置: 代码迷 >> 综合 >> NOIP2018 模拟测试 day1 弓箭手
  详细解决方案

NOIP2018 模拟测试 day1 弓箭手

热度:20   发布时间:2023-12-06 07:59:18.0

题目:
弓箭手

弓箭手 SmallR 和 Zanoes 在进行一场比赛。他们轮流射击,SmallR 先射。每次射击,SmallR 都有 a/b 的概率命中靶心,而 Zanoes 有 c/d 的概率命中靶心。先命中靶心的赢得比赛。求 SmallR 赢得比赛的概率。 

思路:
似乎,只用在[0,1]区间操作好多好多次,每次把剩下的部分分成三段,一段给smallr,一段给zanoes,再剩下来的一段继续分。
嗯,来自lyd的思路:

p=a/b q=(1-a/b)*(1-c/d) 0<q<1p+p*q+p*q^2+p*q^3+.... =p*(1+q+q^2+q^3+...) =p*(1-q^oo)/(1-q) =p/(1-q) 

代码:

#include<bits/stdc++.h> using namespace std;#define ll long long #define db doubledb a,b,c,d;void readin() {
     scanf("%lf%lf%lf%lf",&a,&b,&c,&d); }int main() {
     readin();db l=0,r=1;for(int i=1;i<=100000;i++) {
     db len=r-l;l=l+len*(a/b);r=r-(r-l)*(c/d);if(l==r) break;}printf("%.12lf",l);return 0; }