HDU 5236 Article [概率DP]

原创 2015年11月19日 13:37:23

Description

As the term is going to end, DRD begins to write his final article. 

DRD uses the famous Macrohard's software, World, to write his article. Unfortunately this software is rather unstable, and it always crashes. DRD needs to write  characters in his article. He can press a key to input a character at time , where  is an integer equal or greater than 0. But at every time  for integer  strictly greater than 0, World might crash with probability  and DRD loses his work, so he maybe has to restart from his latest saved article. To prevent write it again and again, DRD can press Ctrl-S to save his document at time . Due to the strange keyboard DRD uses, to press Ctrl-S he needs to press  characters. If DRD has input his total article, he has to press Ctrl-S to save the document. 

Since World crashes too often, now he is asking his friend ATM for the optimal strategy to input his article. A strategy is measured by its expectation keys DRD needs to press. 

Note that DRD can press a key at fast enough speed. 
 

Input

First line: an positive integer  indicating the number of cases. 
Next T lines: each line has a positive integer , a positive real , and a positive integer 
 

Output

For each test case: output ''Case #k: ans'' (without quotes), where  is the number of the test cases, and  is the expectation of keys of the optimal strategy. 
Your answer is considered correct if and only if the absolute error or the relative error is smaller than 

题意:

题意非常难懂,最后看了别人的表述才明白:你现在要打n个字符,但是程序随时可能会崩溃。
你可以在恰当的时机同时按下X个键用来保存,崩溃后,会从最后一次保存的情况继续开始打字。

解法

可以考虑概率DP,dp(i)表示不保存直接打到i个字符所需要按键数期望
有公式:d(i)=d(i1)+1+pd(i)

化简得:d(i)=11pd(i1)+11p

发现是等比数列,几何倍增长,所以DP前几百个就好了,否则就暴double了。

然后枚举分成几段保存,这几段肯定是尽可能均匀(理由同上),然后直接计算期望就好了。(枚举段的最长长度是不对的,因为一个最长长度可能对应多种分段的方案)

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<bitset>
#pragma comment(linker, "/STACK:1024000000,1024000000")
template <class T>
bool scanff(T &ret){ //Faster Input
    char c; int sgn; T bit=0.1;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    if(c==' '||c=='\n'){ ret*=sgn; return 1; }
    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;
    ret*=sgn;
    return 1;
}
#define inf 1073741823
#define llinf 4611686018427387903LL
#define PI acos(-1.0)
#define lth (th<<1)
#define rth (th<<1|1)
#define rep(i,a,b) for(int i=int(a);i<=int(b);i++)
#define drep(i,a,b) for(int i=int(a);i>=int(b);i--)
#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)
#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)
#define mem(x,val) memset(x,val,sizeof(x))
#define mkp(a,b) make_pair(a,b)
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;


double dp[1111];
int main(){
    tdata{
        int n;
        double tx;
        double p;
        scanff(n);scanff(p);scanff(tx);
        dp[0]=0.0;
        int num=0;
        rep(i,1,1000){
            num++;
            dp[i]=(dp[i-1]+1.0)/(1.0-p);
            if(dp[i]>(llinf)/10.0)break;
        }

        int k=n/num+1;
        double ans=llinf*1.0;
        rep(i,k,n){
            int len=n/i;
            int x=n%i;
            int y=i-x;
            ans=min(ans,double(x)*dp[len+1]+double(y)*dp[len]+double(tx)*double(i));
        }
        printf("Case #%d: %lf\n",cas,ans);
    }
}
/*
3 5 3
2 2 3
2 1 3
2 1 2
3 2 3 1
2 1 2

3 2 2
3 2 3 1
3 1 2 3

0 0 0
*/


版权声明:文為博主原創文章,未經博主允許不得轉載。

hdu 5236 Article 概率dp

题意: 一个人打文章,他需要打n个字符,他在第i+0.1秒的时候输入一个字符,在i+0.9秒的时候系统可能崩溃,那么他将从上次保存的位置开始输入 在每个i时刻他都可以按下x个字符然后按ctrl+s...
  • zp___waj
  • zp___waj
  • 2017年04月29日 16:40
  • 202

概率dp hdu 5236

说好听一点又一次的涨姿势了,说难听一点又被虐的体无完肤。 感觉这道题难,首先连题目样例都没读懂。 算了直接上代码。 #include #include #include #include #inclu...
  • driver13
  • driver13
  • 2015年11月10日 20:34
  • 169

HDU 5236 Article

题意: 每 i+0.1秒可以打一个字 每 i+0.9秒软件有P的概率会崩溃(然后只能打开上一次保存的文章继续打字) 每 i秒可以保存一次但是代价为     要打X个字符后才能保存(此时可以看成一...
  • Mr_Xujh
  • Mr_Xujh
  • 2015年06月12日 20:37
  • 444

概率DP——HDU 5236

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5236 题意:现在有一个特殊的键盘,在 i+0.1i+0.1 秒可以输入一个数,在 i+0.9i+0.9...
  • FeBr2
  • FeBr2
  • 2017年04月08日 21:05
  • 262

hdu - 5236 Article(2015上海大都会赛)概率dp

Article Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...
  • u010660276
  • u010660276
  • 2015年06月04日 21:25
  • 1033

HDU 3366 Passage (概率DP)

Passage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...
  • Interstellar_
  • Interstellar_
  • 2016年07月26日 19:29
  • 836

Hdu 5236 Article(dp)

题目链接 Article Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...
  • madaidao
  • madaidao
  • 2015年06月12日 15:45
  • 430

HDU4652Dice(概率DP)

HDU4652Dice(概率DP)2013 Multi-University Training Contest 5
  • u013790563
  • u013790563
  • 2015年08月27日 15:01
  • 743

【HDU5583 2015上海赛区L】【找规律 正难则反】LCM Walk 目标状态(x,y)哪些点走公倍数能走到它

LCM Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S...
  • snowy_smile
  • snowy_smile
  • 2015年11月28日 22:26
  • 1442

HDU-4035 Maze (概率DP&&树形DP)

理解题以后觉得没法做。。。只理解了有向图,因为本题是无向边,所以父子结点的概率互相影响,立刻就忘了上一题也存在这种情况。。。 看了题解后才明白,应该按照期望设状态,而且需要在树上进行状态转移,最开始的...
  • idealism_xxm
  • idealism_xxm
  • 2016年04月30日 12:44
  • 398
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 5236 Article [概率DP]
举报原因:
原因补充:

(最多只允许输入30个字)