题解 QOJ#9381 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)})\).
由
得
引理
设\(|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} \]
显然上式可用引理化简
又
所以
于是
因此最终期望为:
此为对勾函数,连续情形下最小点为\(c_0=\sqrt{2T}\),
整数情形下只需在其最近的两个整点中取最小。
即
\(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;
}

浙公网安备 33010602011771号