题目分析
问题描述
Tobby\texttt{Tobby}Tobby 参加一个在矩形场地上进行的游戏。场地左下角坐标为 (xL,yL)(x_L, y_L)(xL,yL),右上角坐标为 (xR,yR)(x_R, y_R)(xR,yR)。游戏规则是:每个参与者投掷两枚硬币,硬币落点均匀分布在矩形区域内(包括边界),且两次投掷相互独立。游戏的获胜者是两枚硬币落点之间线段长度最长的参与者。
Tobby\texttt{Tobby}Tobby 想知道他获胜的机会有多大,因此需要计算两枚硬币落点之间距离平方的期望值:
E[∣∣p1−p2∣∣2]=E[(x1−x2)2+(y1−y2)2]E[||\mathbf{p}_1 - \mathbf{p}_2||^2] = E[(x_1 - x_2)^2 + (y_1 - y_2)^2]E[∣∣p1−p2∣∣2]=E[(x1−x2)2+(y1−y2)2]
关键观察
- 独立性:x1x_1x1 与 x2x_2x2 独立,y1y_1y1 与 y2y_2y2 独立,且 xxx 坐标与 yyy 坐标相互独立
- 均匀分布:所有坐标在各自区间内均匀分布
- 可分离性:期望运算可以分解为 xxx 方向和 yyy 方向分别计算
数学推导
xxx 方向的计算
设 X1,X2∼Uniform[a,b]X_1, X_2 \sim \text{Uniform}[a,b]X1,X2∼Uniform[a,b],其中 a=xLa = x_La=xL,b=xRb = x_Rb=xR。
均匀分布的均值和方差为:
- 均值:E[X]=a+b2E[X] = \frac{a+b}{2}E[X]=2a+b
- 方差:Var(X)=(b−a)212\text{Var}(X) = \frac{(b-a)^2}{12}Var(X)=12(b−a)2
对于两个独立随机变量 X1X_1X1 和 X2X_2X2:
E[(X1−X2)2]=Var(X1−X2)+[E(X1−X2)]2E[(X_1 - X_2)^2] = \text{Var}(X_1 - X_2) + [E(X_1 - X_2)]^2E[(X1−X2)2]=Var(X1−X2)+[E(X1−X2)]2
由于 E[X1−X2]=0E[X_1 - X_2] = 0E[X1−X2]=0,且方差具有可加性:
Var(X1−X2)=Var(X1)+Var(X2)=(b−a)212+(b−a)212=(b−a)26\text{Var}(X_1 - X_2) = \text{Var}(X_1) + \text{Var}(X_2) = \frac{(b-a)^2}{12} + \frac{(b-a)^2}{12} = \frac{(b-a)^2}{6}Var(X1−X2)=Var(X1)+Var(X2)=12(b−a)2+12(b−a)2=6(b−a)2
因此:
E[(x1−x2)2]=(xR−xL)26E[(x_1 - x_2)^2] = \frac{(x_R - x_L)^2}{6}E[(x1−x2)2]=6(xR−xL)2
yyy 方向的计算
同理可得:
E[(y1−y2)2]=(yR−yL)26E[(y_1 - y_2)^2] = \frac{(y_R - y_L)^2}{6}E[(y1−y2)2]=6(yR−yL)2
最终公式
将两个方向的结果相加:
E[distance2]=(xR−xL)2+(yR−yL)26E[\text{distance}^2] = \frac{(x_R - x_L)^2 + (y_R - y_L)^2}{6}E[distance2]=6(xR−xL)2+(yR−yL)2
算法设计
基于上述推导,算法非常简单:
- 读取每个测试用例的 xL,yL,xR,yRx_L, y_L, x_R, y_RxL,yL,xR,yR
- 计算矩形宽度 dx=xR−xLdx = x_R - x_Ldx=xR−xL 和高度 dy=yR−yLdy = y_R - y_Ldy=yR−yL
- 应用公式:result=dx2+dy26result = \frac{dx^2 + dy^2}{6}result=6dx2+dy2
- 输出结果,精度满足 10−510^{-5}10−5 的要求
复杂度分析
- 时间复杂度:O(1)O(1)O(1) 每个测试用例
- 空间复杂度:O(1)O(1)O(1)
样例验证
样例 1
输入:-100 -50 23 400
dx = 123, dy = 450
结果 = (123² + 450²) / 6 = (15129 + 202500) / 6 = 217629 / 6 = 36271.5
样例 2
输入:0 0 500 1
dx = 500, dy = 1
结果 = (500² + 1²) / 6 = (250000 + 1) / 6 = 250001 / 6 ≈ 41666.8333333333
代码实现
// Tobby and the Line Game
// UVa ID: 13099
// Verdict: Accepted
// Submission Date: 2025-10-24
// UVa Run Time: 0.000s
//
// 版权所有(C)2025,邱秋。metaphysis # yeah dot net
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
int xL, yL, xR, yR;
while (scanf("%d%d%d%d", &xL, &yL, &xR, &yR) != EOF) {
double dx = xR - xL;
double dy = yR - yL;
double result = (dx * dx + dy * dy) / 6.0;
printf("%.15f\n", result);
}
return 0;
}
代码说明
- 使用
double类型避免整数溢出并保证精度 - 使用
scanf和printf进行高效的输入输出 - 循环读取直到文件结束(
EOF) - 输出保留 151515 位小数,远高于题目要求的 10−510^{-5}10−5 精度
该解法利用了概率论中均匀分布的性质,将复杂的三重积分问题转化为简单的代数运算,既高效又准确。

3746

被折叠的 条评论
为什么被折叠?



