Fireworks(2020 ICPC南京)

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fireworks(2020 ICPC南京)相关的知识,希望对你有一定的参考价值。

Fireworks

题意:

你每做一个烟花要n分钟,释放已做好的所有烟花需要m分钟,每只烟花成功释放的概率为p。问你在采取最优策略的前提下,直到成功释放第一个烟花时最小的期望时间花费。

题解:

最佳策略是:每次集中做法,然后集中释放。所以我们设每制作k个烟花后集中释放一次,直到某次释放时成功出现一次为止。求当前期望时间花费,这是一个典型的几何分布
每轮的时间开销为:T = k * n + m,每轮至少成功释放烟花的概率为P,P怎么求?一次都不成功的概率为(1 - p)k,那么P=1-(1-p)k,根据几何分布公式期望为E = 1/P,乘以每轮开销的期望时间花费为T * E
这是一个单峰的凹函数,通过三分找答案

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\\n",a,b);
typedef long long ll;
using namespace std;

inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
   return s*w;
}
long double fun(int k,int n,int m,long double p){
	return ((long double)k*n+m)/((long double)1.0-pow(1.0-p,k));
}
int main()
{
	int t;
	cin>>t;
	while(t--){
		int n,m;
		double p;
		cin>>n>>m>>p;
		p*=(1e-4);
		int l=1,r=0x3f3f3f3f;
		while(l<r){
			int mid1=l+(r-l)/3;
			int mid2=r-(r-l)/3;
			if(fun(mid1,n,m,p)<fun(mid2,n,m,p))r=mid2-1;
			else l=mid1+1;
		}
		printf("%.10Lf\\n",fun(l,n,m,p));
	}
}

以上是关于Fireworks(2020 ICPC南京)的主要内容,如果未能解决你的问题,请参考以下文章

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)签到题F Fireworks

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京),签到题4题

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京),签到题4题

2018icpc南京网络赛-E AC Challenge(状压+dfs)

2018 ACM/ICPC 南京 I题 Magic Potion

2018ICPC南京网络赛