ICPC2020南京F.Fireworks

写在前面

大概是高中退役之后第一次写写题解,当然要从基础写起,因为变得更菜了,所以只能写写更水的题目了

题目链接

ICPC南京F

题解

点燃之的问题与点燃前像相同,所以最优方案为每次都点燃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)); 
    }
} 
posted @ 2020-12-25 20:10  zzzzx  阅读(404)  评论(0编辑  收藏  举报