列表

详情


NC19820. 双倍掉率

描述

终于活成了自己讨厌的样子。
对于每个关卡,原本会以p的概率掉衣服。如果双倍概率,那么会以的概率掉衣服。
经过统计,栗子米抽了n次一倍掉率的关卡,掉了a次衣服,抽了m次二倍掉率的关卡,掉了b次衣服。能不能告诉栗子米,暖婊真实的掉率最可能是多少。你可以认为在做统计之前,p为一个[0,1]之间的均匀分布。

输入描述

第一行一个整数T(T≤ 105),表示数据组数。
每组数据第一行四个整数n,m,a,b(1≤ n,m≤ 109,0≤ a≤ n,0≤ b≤ m)。

输出描述

对于每组数据,输出一个0到1之间的实数,表示最有可能的概率,保证这个最有可能的概率是良好并且唯一定义的,如果相对误差或者绝对误差在10-9之内那么你的答案被认为是正确的。

示例1

输入:

5
3 3 1 2
3 3 0 0
3 3 3 3
5 5 5 0
7 9 2 6

输出:

0.3333333333
0.0000000000
1.0000000000
0.2500000000
0.3253523925

原站题解

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

C++11(clang++ 3.9) 解法, 执行用时: 69ms, 内存消耗: 1656K, 提交时间: 2020-08-28 10:59:47

#include<bits/stdc++.h>
using namespace std;
typedef double D;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		long long n,m,a,b;
		scanf("%lld%lld%lld%lld",&n,&m,&a,&b);
		if(2*a>=n&&m==b){
			printf("%.10f\n",a*1.0/n);
		}else{
			D A=2*(n+m);
			D B=-(2*a+b+n+2*m);
			D C=a+b;
			D det=sqrt(B*B-4*A*C);
			D root=(-B-det)/(2*A);
			printf("%.10f\n",root);
		}
	}
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 931ms, 内存消耗: 4600K, 提交时间: 2018-10-06 20:49:27

import math
t = int(input())
for i in range (t) :
    n, m, x, y = list(map(int, input().split()))
    if(2 * x >= n and y == m) :
        print('%.10f' % (x / n))
        continue
    a = 2 * n + 2 * m
    b = -(n + 2 * m + 2 * x + y)
    c = x + y
    d = math.sqrt(b * b - 4 * a * c)
    ans = -(b + d) / (2 * a)
    print('%.10f' % ans)
    

上一题