hdu 5236 Article 概率dp

来源:互联网 发布:c语言经典代码 编辑:程序博客网 时间:2024/05/20 22:03

题意:

一个人打文章,他需要打n个字符,他在第i+0.1秒的时候输入一个字符,在i+0.9秒的时候系统可能崩溃,那么他将从上次保存的位置开始输入

在每个i时刻他都可以按下x个字符然后按ctrl+s保存

求他把所有文章输入后所需要按下字符的期望数

分析:

题目意思理解不透彻想了很久,看了题解想了很就才弄懂。

首先我们不考虑保存的情况:设dp【i】为输入完i个字符的期望

那么dp【i】=dp【i-1】+dp【i】*p+1=====》dp【i】=(dp【i】+1)/(1-p)

然后就是枚举保存的次数,因为n个字符需要n秒,那么最多保存n次,

显然保存x次的时候每次都在输入n/x字符的时候保存使得总期望最小

ACcode:

#include <set>#include <queue>#include <cmath>#include <cstdio>#include <cstring>#include <stdlib.h>#include <iostream>#include <algorithm>#define maxn 100005using namespace std;double  dp[maxn],p;int n,loop,x;int main(){    int n,loop,cnt=1;    scanf("%d",&loop);    while(loop--){        scanf("%d%lf%d",&n,&p,&x);        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;++i)dp[i]=(dp[i-1]+1)/(1-p);        double ans=0x3f3f3f3f3f;        for(int i=1;i<=n;++i){            int a=n/i;            int b=n%i;            ans=min(ans,dp[a+1]*b+dp[a]*(i-b)+x*i);        }        printf("Case #%d: %.6lf\n",cnt++,ans);    }    return 0;}


0 0