设策略为每次造 个烟花然后放一次,不断如此操作,直到达成为止,设 ,则期望值为: 提取变量,即设 ,即求 ,代入错位相减法公式解得 ,即 故 ,即: 即求一个正整数 ,使一元函数 最小并输出最值。
求导得: 显然 ,注意到 ,有 。观察可知函数如果不单调,一定是 U 型的,不妨直接三分求解。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using db = double;
ll t, n, m, p;
db q;
db f(ll x)
{
return (x * n + m) / (1 - pow(q, x));
}
signed main()
{
scanf("%lld", &t);
while (t--)
{
scanf("%lld%lld%lld", &n, &m, &p);
q = 1 - 1e-4 * p;
ll lf = 1, rf = 1e9;
db ans = 1e21;
while (lf < rf)
{
ll lc = (2 * lf + rf) / 3, rc = (2 * rf + lf + 2) / 3;
db lv = f(lc), rv = f(rc);
ans = min({ans, lv, rv});
if (lv < rv)
{
rf = rc - 1;
}
else
{
lf = lc + 1;
}
}
printf("%.12lf\n", ans);
}
return 0;
}