题解 QOJ#9381 502 Bad Gateway

L. 502 Bad Gateway

题目大意:

比赛第\(0\)秒,计时器均匀随机生成一个整数\(t_0\in[1,T]\)。之后每一秒,要么当前计时减一,要么重置计时器,随机均匀生成一个新的整数\(t'\in[1,T]\)。设第\(x\)秒时计时器减为\(0\),则\(x\)即为总罚时,比赛结束。

均匀随机生成一个整数\(t\in[1,T]\)即:\(P(t=i)=\frac{1}{T},i=1,2,\dots,T\).

求最优策略下的期望罚时。

核心问题:什么是最优策略?

首先可以发现,如果某一秒要选择重置计时器,那么前面不选择重置的时间都是无意义的,
因此最优策略一定先重置后等待.

假设先重置\(n\)次计时,计时器变为\(c\),然后把它耗尽,则最终罚时为:\(n+c\).
\(E(n+c)\).

1.不重置计时器

由于\(P(t_0=i)=\frac{1}{T},i=1,2,\dots,T\),

故期望罚时为:\(E(t_0)=\frac{T+1}{2}\).

2.固定重置\(n\)次计时器

由于\(t_0,t_1,\dots,t_n\;i.i.d.\),

故期望罚时为:\(n+E(t_n)=n+\frac{T+1}{2}\).

显然\(n=0\)时最优,且等价于上一种策略。

3.一直重置,直到计时器小于等于阈值\(c\in[1,T]\)

\(N(c)\in[0,\infty]\)表示计时器小于等于阈值\(c\)所用重置次数,
则罚时为\(N(c)+t_{N(c)}\),其中\(t_{N(c)}\le c\).

接下来求\(E(N(c)+t_{N(c)})\).

\[\begin{align*}P(N(c)=0)&=P(t_0\le c)=\sum_{i=1}^{c}P(t_0=i)=\frac{c}{T}\\P(N(c)=n)&=P(t_0>c,t_1>c,\dots,t_{n-1}>c,t_n\le c)\\&=(1-\frac{c}{T})^{n}\frac{c}{T}\end{align*} \]

\[\begin{align*}E(N(c))&=\sum_{n=0}^{\infty}nP(N(c)=n)\\&=\sum_{n=0}^{\infty}n(1-\frac{c}{T})^{n}\frac{c}{T}\end{align*} \]

引理

\(|p|<1\),则

\[\sum_{n=0}^{\infty}np^{n-1}=\sum_{n=0}^{\infty}(p^{n})'=(\sum_{n=0}^{\infty}p^{n})'=(\frac{1}{1-p})'=\frac{1}{(1-p)^2} \]

显然上式可用引理化简

\[\begin{align*}E(N(c))&=(1-\frac{c}{T})\times\frac{c}{T}\times\sum_{n=0}^{\infty}n(1-\frac{c}{T})^{n-1}\\&=(1-\frac{c}{T})\times\frac{c}{T}\times\frac{1}{(\frac{c}{T})^2}\\&=\frac{T}{c}-1\end{align*} \]

\[\begin{align*}&P(N(c)=n,t_n=i)\\=&P(t_0>c,\dots,t_{n-1}>c,t_n=i\le c)\\=&\begin{cases}(1-\frac{c}{T})^{n}\frac{1}{T}&,i=1,2,\dots,c\\0&,i=c+1,\dots,T\end{cases}\end{align*} \]

所以

\[\begin{align*}P(t_{N(c)}=i)&=\sum_{n=0}^{\infty}P(N(c)=n,t_n=i)\\&=\frac{1}{T}\sum_{n=0}^{\infty}(1-\frac{c}{T})^{n}\\&=\frac{1}{c}\;,i\le c\end{align*} \]

于是

\[E(t_{N(c)})=\sum_{i=1}^{c}iP(t_{N(c)}=i)=\sum_{i=1}^{c}\frac{i}{c}=\frac{c+1}{2} \]

因此最终期望为:

\[E(N(c)+t_{N(c)})=E(N(c))+E(t_{N(c)})=\frac{T}{c}+\frac{c}{2}-\frac{1}{2} \]

此为对勾函数,连续情形下最小点为\(c_0=\sqrt{2T}\)
整数情形下只需在其最近的两个整点中取最小。

\[\min E(N(c)+t_{N(c)})=\min\{\frac{T}{\left\lfloor c_0\right\rfloor}+\frac{\left\lfloor c_0\right\rfloor}{2}-\frac{1}{2},\frac{T}{\left\lceil c_0\right\rceil}+\frac{\left\lceil c_0\right\rceil}{2}-\frac{1}{2}\} \]

\(c=2\)时:\(E(N(c)+t_{N(c)})=\frac{T+1}{2}\)

因此:\(\min E(N(c)+t_{N(c)})\le \frac{T+1}{2}\)

通过贝尔曼最优性原理可以证明这就是最优策略,在此略过.

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define ld long double
#define pii pair<int, int>
#define pdd pair<double, double>
#define PI acos(-1.0)
#define endl '\n'

using namespace std;

const int N = 1e5 + 10, M = 1e6 + 10, INF = 1000000000000000000, MOD = 998244353;
const double eps = 1e-8;

inline int read() { //快读,1e6规模数据比较有用
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = (x << 3) + (x << 1) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}

inline void write(int x, int y) {  //输出有理数
    int d = __gcd(x, y);
    cout << x / d << ' ' << y / d << endl;
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int n = read();
    while (n--) {
        int T = read();
        double sq = sqrt(T * 2);
        int x1 = floor(sq), x2 = ceil(sq);
        int a1 = T * 2 + x1 * (x1 - 1), a2 = T * 2 + x2 * (x2 - 1);
        int b1 = x1 * 2, b2 = x2 * 2;   //通分为一个有理数
        if (a1 * b2 > a2 * b1)  //有理数比较大小
            write(a2, b2);
        else 
            write(a1, b1);
    }
    return 0;
}
posted @ 2026-09-05 00:19  Luliaaa  阅读(10)  评论(0)    收藏  举报