hdu5781 2016多校1001 ATM Machine

http://acm.hdu.edu.cn/showproblem.php?pid=5781

当时并没有做出这题。

一个人只记得存款上限K,最多取W次,同时她想要取完钱并且取钱次数最少,问期望是多少。

 dp[i][j]=min(dp[i][j],(i-k+1)*1.0/(i+1)*dp[i-k][j]+k*1.0/(i+1)*dp[k-1][j-1]+1);

这样无疑会超时,但是有一个性质,如果p取不了,那么p+1更取不了,所以取钱次数最多logk=11

至于要是次数不够,那就定义为无穷

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<string>
#include<cctype>
#include<stack>
#include<queue>
#include<set>
#include<sstream>
#include<map>
#include<ctime>
using namespace std;
#define For(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,k,n) for(int i=n;i>=k;i--)
#define Lson (u<<1)
#define Rson ((u<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define NEG(a) memset(a,-1,sizeof(a));
#define FILL(a) memset(a,0x3f,sizeof(a));
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define print(b,a) cout<<b<<"="<<a<<endl;
#define printbin(b,a){int tmp=a;string s;do{s+=tmp%2+'0';tmp/=2;}while(tmp);reverse(s.begin(),s.end());cout<<"bin "<<b<<"="<<s<<endl;}
#define printarr(i,a,f,b) {For(i,f,b) printf("%d ",a[i]); printf("\n");}
#define fp   freopen("in.txt","r",stdin)
#define maxn 2005
#define lim 11

double dp[maxn][maxn];
void init()
{
    for(int i=1;i<=2000;i++)
        for(int j=0;j<=lim;j++)
            dp[i][j]=INF;
    for(int i=0;i<=lim;i++)
        dp[0][i]=0;
    for(int i=1;i<=2000;i++)
        for(int j=1;j<=lim;j++)
            for(int k=1;k<=i;k++)
                dp[i][j]=min(dp[i][j],(i-k+1)*1.0/(i+1)*dp[i-k][j]+k*1.0/(i+1)*dp[k-1][j-1]+1);
}
int main()
{
    int k,w;
    init();
    while(scanf("%d%d",&k,&w)!=EOF)
        printf("%.6f\n",dp[k][min(w,lim)]);
    return 0;
}
View Code

 

posted @ 2016-08-05 13:50  aidgn  阅读(120)  评论(0编辑  收藏  举报