列表

详情


NC14962. Alice和Bob赌糖果

描述

Alice和Bob赌糖果。规则是这样的:Alice从[ l, r]中随机抽一个数,Bob从[ L, R]中随机抽一个数,谁抽的数大谁就赢,输的一方给另一方1颗糖(平局不用给糖),他们会一直赌下去直到有一方没有糖果为止。

Alice有n颗糖果,Bob有m颗糖果,求Alice将Bob的糖果赢完的概率。

输入描述

第一行3个整数n, l, r。
第二行3个整数m, L, R。

输出描述

Alice将Bob糖果赢完的概率,结果保留5位小数。

示例1

输入:

1 1 3
1 1 2

输出:

0.75000

示例2

输入:

0 1 100
1 1 100

输出:

0.00000

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 9ms, 内存消耗: 1976K, 提交时间: 2022-11-12 16:19:53

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+100;
double f[N];
signed main()
{
    int n,l1,l2,r1,r2,m;
    cin>>n>>l1>>r1>>m>>l2>>r2;
    int x=0,y=0;
    for(int i=l1;i<=r1;i++)
    {
        for(int j=l2;j<=r2;j++)
        {
            if(i>j)
                x++;
            else if(i<j)
                y++;
        }
    }
    f[1]=(double)x/(x+y);
    for(int i=2;i<n+m;i++)
        f[i]=(double)x/(x+y-f[i-1]*y);

    double ans=1;
    for(int i=n;i<m+n;i++)
        ans*=f[i];
    printf("%.5f\n",ans);
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 8ms, 内存消耗: 412K, 提交时间: 2020-08-15 23:58:10

#include <cstdio>

int main()
{
	int n, l, r, m, L, R;
	scanf("%d%d%d%d%d%d", &n, &l, &r, &m, &L, &R);
	if (n == 0)
	{
		printf("0.00000\n");
		return 0;
	}
	double p = 0, s = 0;
	for (int i = l; i <= r; ++i)
	{
		for (int j = L; j <= R; ++j)
		{
			if (i != j)
				++s;
			if (i > j)
				++p;
		}
	}
	p /= s;
	s = 1;
	double t = 0;
	for (int i = 1; i <= n + m - 1; ++i)
	{
		t = p / (1 - (1 - p) * t);
		if (i >= n)
			s *= t;
	}
	printf("%.5lf\n", s);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 10ms, 内存消耗: 1920K, 提交时间: 2018-02-12 11:42:52

#include<stdio.h>

int n,m,l,r,L,R,up,dn,mid;
double k[200005],ans=1; 

int main()
{
	scanf("%d%d%d%d%d%d",&n,&l,&r,&m,&L,&R);
	for (int i=l;i<=r;i++) for (int j=L;j<=R;j++){dn++;if (j<i) up++;if (j==i) mid++;}
	k[1]=(up+0.0)/(dn-mid);
	for (int i=2;i<m+n;i++) k[i]=up/(dn-k[i-1]*(dn-up-mid)-mid);
	for (int i=n;i<m+n;i++) ans*=k[i];
	printf("%.5f",ans);
}

上一题