NC19820. 双倍掉率
描述
输入描述
第一行一个整数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)