poj Chocolate dp递推+精度问题

    技术2022-06-12  68

    //首先要注意的就是这题的奇偶性,因为概率在n越大的时候增长的越慢,但题目只要求小数点后3位,,所以之后的计算是无谓的,double的精度也不够

    //然后就是使用一下小滚动数组咯,,虽然是水题,,但是tle好几次 555

    #include <iostream> #include <queue> #include <stack> #include <string> #include <map> #include <vector> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int MAX=1000005,INF=1<<30; int c,n,m; double pre[105],f[105],pro[105]; int main() { #ifndef ONLINE_JUDGE freopen("i.txt", "r", stdin); #endif while(scanf("%d",&c)==1){ if(c==0) break; scanf("%d%d",&n,&m); if(c==0){ if(m) cout<<"0.000"<<endl; else cout<<"1.000"<<endl; continue; } if(n==0&&m==0){ cout<<"1.000"<<endl; continue; } if(m>c){ cout<<"0.000"<<endl; continue; } memset(f,0,sizeof(f)); memset(pre,0,sizeof(pre)); for(int i=0;i<=c;i++) pro[i]=(double)i/(double)c; pre[0]=1; if(n&1){ n=n>1205?1205:n; } else{ n=n>1206?1206:n; } for(int i=1;i<=n;i++){ for(int j=0;j<=c;j++){ f[j]=0; if(j-1>=0) f[j]+=pre[j-1]*pro[c-j+1];//f[j]+=pre[j-1]*(double)(c-j+1)/(double)c; if(j+1<=c) f[j]+=pre[j+1]*pro[j+1];//f[j]+=pre[j+1]*(double)(j+1)/(double)c; } memcpy(pre,f,sizeof(pre)); } printf("%.3lf/n",f[m]); } return 0; }


    最新回复(0)