UVa 13099 Tobby and the Line Game

题目分析

问题描述

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[∣∣p1p22]=E[(x1x2)2+(y1y2)2]

关键观察

  1. 独立性x1x_1x1x2x_2x2 独立,y1y_1y1y2y_2y2 独立,且 xxx 坐标与 yyy 坐标相互独立
  2. 均匀分布:所有坐标在各自区间内均匀分布
  3. 可分离性:期望运算可以分解为 xxx 方向和 yyy 方向分别计算

数学推导

xxx 方向的计算

X1,X2∼Uniform[a,b]X_1, X_2 \sim \text{Uniform}[a,b]X1,X2Uniform[a,b],其中 a=xLa = x_La=xLb=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(ba)2

对于两个独立随机变量 X1X_1X1X2X_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[(X1X2)2]=Var(X1X2)+[E(X1X2)]2

由于 E[X1−X2]=0E[X_1 - X_2] = 0E[X1X2]=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(X1X2)=Var(X1)+Var(X2)=12(ba)2+12(ba)2=6(ba)2

因此:
E[(x1−x2)2]=(xR−xL)26E[(x_1 - x_2)^2] = \frac{(x_R - x_L)^2}{6}E[(x1x2)2]=6(xRxL)2

yyy 方向的计算

同理可得:
E[(y1−y2)2]=(yR−yL)26E[(y_1 - y_2)^2] = \frac{(y_R - y_L)^2}{6}E[(y1y2)2]=6(yRyL)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(xRxL)2+(yRyL)2

算法设计

基于上述推导,算法非常简单:

  1. 读取每个测试用例的 xL,yL,xR,yRx_L, y_L, x_R, y_RxL,yL,xR,yR
  2. 计算矩形宽度 dx=xR−xLdx = x_R - x_Ldx=xRxL 和高度 dy=yR−yLdy = y_R - y_Ldy=yRyL
  3. 应用公式:result=dx2+dy26result = \frac{dx^2 + dy^2}{6}result=6dx2+dy2
  4. 输出结果,精度满足 10−510^{-5}105 的要求

复杂度分析

  • 时间复杂度: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;
}

代码说明

  1. 使用 double 类型避免整数溢出并保证精度
  2. 使用 scanfprintf 进行高效的输入输出
  3. 循环读取直到文件结束(EOF
  4. 输出保留 151515 位小数,远高于题目要求的 10−510^{-5}105 精度

该解法利用了概率论中均匀分布的性质,将复杂的三重积分问题转化为简单的代数运算,既高效又准确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值