列表

详情


NC20132. [JLOI2012]时间流逝

描述

生活可以很简单。可以探索水底世界的神秘,也可以去发现奇特新生物,亦或踏上一段新生的旅程。在必须要迎接挑战或跟周围的生物进行生存争夺之前,享受自由的飞翔。此时你会觉得生活是如此美好。        
像蛇喜欢吃浮游生物一样(哦,我好像忘记告诉你这个常识),每天,你可以吃一些你周围的基础生物,然后会在你的尾巴上得到一个能量圈。你将会有好多种不同的能量圈,每一个都会被赋予一个能量。你可以拥有多个同种的能量圈,但是对于新得到的相同的能量圈,它的能量不能大于你已拥有的任何一个能量圈。除了前面的规则,获得新的能量圈的种类的概率是一样的。一天天过去,你得到越来越多的能量,开始了进化演变。        
但是你也有自己的问题,有时你会面对邪恶的果冻鱼。它会追着你咬你,你不得不扔出最小能量值的能量圈然后赶忙逃跑。在这种情况下,你不会有任何的胃口了,因此这天你将不再得到任何能量圈。幸好,当你没有任何能量圈的时候,果冻鱼就算看见你也不会追着你,此时你可以好好地享用美食。        
你听说当你的总的能量值超过了某个阈值之后,可以进化成强大模式并能够吃掉果冻鱼。是时候反击了!下面是本题的问题:预计要过多少天你才能进化成强大模式?(第一天默认你没有任何能量圈)

输入描述

输入包含多个测例。对每个测例会有两行。
第一行是一个浮点数P,一个整数T和一个整数N。P是每天遇到果冻鱼的概率,T是阈值。
第二行是N个不同的正整数,表示每一种能量圈的能量值。

输出描述

对于每个测例,输出一行表示预计要过多少天你的能量值能够超过阈值,四舍五入到三位小数。

示例1

输入:

0.5 0 1
1
0.5 1 2
1 2

输出:

1.000
2.000

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 26ms, 内存消耗: 496K, 提交时间: 2020-03-28 14:36:34

#include<bits/stdc++.h>
using namespace std;

double p;
int T,n;
int a[100]; 
pair<double,double> dfs(int sum,int lim)
{
	if(sum>T) return make_pair(0,0);
	double P1=sum?p:0.0;
	double k=0.0,b=0.0,A=(1-P1)/lim;
	for(int i=1;i<=lim;i++)
	{
		auto tmp=dfs(sum+a[i],i);
		k+=tmp.first;b+=tmp.second;
	}
	return make_pair(P1/(1-A*k),(1+A*b)/(1-A*k));
}

int main()
{
	while(cin>>p>>T>>n)
	{
		for(int i=1;i<=n;i++) cin>>a[i];
		sort(a+1,a+1+n);
		printf("%.3f\n",dfs(0,n).second);
	}
	return 0;
}

上一题