先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。
#include<cstdio> #include<cstdio> #include<cmath> #include<queue> #include<stack> #include<string> #include<cstring> #include<iostream> #include<map> #include<vector> #include<algorithm> #include<set> #include<cmath> using namespace std; const int mmax = 100010; const double inf = 1e20; double f[mmax]; void build(double p) { f[0]=0; for(int i=1;i<mmax;i++) { f[i]=(f[i-1]+1)/(1.0-p); } } int main() { int t,ca=0; scanf("%d",&t); while(t--) { int n,x; double p; scanf("%d %lf %d",&n,&p,&x); build(p); double ans=inf; for(int i=0;i<n;i++) { int k=n/(i+1); double tmp=f[k+1]*(n%(i+1))+f[k]*(i+1-n%(i+1)); tmp+=1.0*(i+1)*x; ans=min(ans,tmp); } printf("Case #%d: %.6lf\n",++ca,ans); } return 0; }
时间: 2024-11-05 06:16:38