题意:
每 i+0.1秒可以打一个字
每 i+0.9秒软件有P的概率会崩溃(然后只能打开上一次保存的文章继续打字)
每 i秒可以保存一次但是代价为 要打X个字符后才能保存(此时可以看成一瞬间打完X个字)
(整篇文章打完之后当然要保存一次)
求最佳策略使得打的字数量的期望最小
题解:
假设我们要保存k次(枚举k)
那么我们猜想就是使得保存均匀一些
此时求出每段的期望相加
重点就是每段的期望
设dp[i]为打i个字符的期望打字数
dp[i]=dp[i-1]+p(dp[i]+1)+(1-p)*1
要打i个字就要先打dp[i-1]个字
然后在0.1秒的时候打了字
p的概率在0.9秒崩溃此时就加上p*(dp[i]+1) "即重打dp[i]+1个字"
1-p的概率不崩溃此时加上(1-p)*1
所以dp[i]=(dp[i-1]+1)/(1-p);
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cstring>
using namespace std;
const int N=100005;
double dp[N];
double p;
int n,x;
void solve(){
for(int i=1;i<=n;i++){
dp[i]=(dp[i-1]+1)/(1-p);
}
double mi=(1<<30);
for(int i=1;i<=n;i++){
int a=n/i,b=n%i;
mi=min(mi,dp[a+1]*b+dp[a]*(i-b)+x*i);
}
printf("%.6lf\n",mi);
}
int main(){
dp[0]=0;
int t,ks=1;
scanf("%d",&t);
while(t--){
scanf("%d%lf%d",&n,&p,&x);
printf("Case #%d: ",ks++);
solve();
}
return 0;
}