提示 1: 先把二次方程有解的条件列出来。
提示 2: 在坐标系上画出可能的
提示 3: 什么时候全集并不对应于一个区域呢?此时答案如何?
根据二次方程判别式(也可以手动配方),可以得到:
即可以有
而如果我们在平面直角坐标系上画出
于是我们只需计算这部分的面积,这取决于右上角的点和
给出洛谷题解里的两张图,大概长这样:
在
落到左侧满足条件的概率为
在
我们可以用总概率减去不在区域内的概率,即
如果你停留到此处你的代码将出现 RUNTIME ERROR 一类的错误(实际上来源于除以
否则,
注意这里如果先考虑
于是我们讨论完了所有情况,时间复杂度为
Python 做法如下——
def main():
t = II()
outs = []
for _ in range(t):
a, b = MII()
if b == 0: outs.append(1)
elif a == 0: outs.append(0.5)
elif a < 4 * b: outs.append(0.5 + a / 16 / b)
else: outs.append(1 - b / a)
print('\n'.join(map(str, outs)))
C++ 做法如下——
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
cout << fixed << setprecision(10);
while (t --) {
int a, b;
cin >> a >> b;
if (b == 0) cout << 1 << '\n';
else if (a == 0) cout << 0.5 << '\n';
else if (a < 4 * b) cout << 0.5 + 1.0 * a / 16 / b << '\n';
else cout << 1 - 1.0 * b / a << '\n';
}
return 0;
}