ICPC2020南京F.Fireworks
写在前面
大概是高中退役之后第一次写写题解,当然要从基础写起,因为变得更菜了,所以只能写写更水的题目了
题目链接
题解
点燃之的问题与点燃前像相同,所以最优方案为每次都点燃k个
所以期望是一个关于k的函数,点燃k个至少有一个点燃的为事件\(P\),概率为\(1 - (1 - p) ^ k\)
关于\(P\)的独立重复实验为几何概型,使P发生至少一次的实验次数的期望就是\(\frac{nk+m}{1 - (1 - p) ^ k}\)是个下凸单峰函数。
代码
#include<cmath>
#include<cstdio>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define gc getchar()
#define pc putchar
inline int read() {
char c = gc;
int x = 0;
while(c < '0' || c > '9')c = gc;
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
return x;
}
#define LL long long
#define eps 1e-9
double n,m,p;
double calc(int x) {
return (x * n + m) / (1 - pow(1 - p,x)) ;
}
int main() {
int T = read();
while(T --) {
cin>> n >> m >> p;
p /= 10000;
LL l = 0,r = 1000000007;
while(r - l > 0) {
LL mid = (r - l) / 3;
LL m1 = l + mid,m2 = r - mid;
double c1 = calc(m1);double c2 = calc(m2);
if(c1 < c2) r = m2 - 1;
else l = m1 + 1;
}
printf("%.10lf\n",calc(l));
}
}