noip模拟76
T1
在最优路径上的某一点x,y一定是由x-1,k或k,y-1转移过来的
然后可以预处理le[i][j]表示i,j可以从i-1行最远的那个位置转移过来,up[i][j]同理
然后每行每列单调队列优化dp
T3
若前面最大的小于后面最小的,最优策略肯定是原地等,否则拿走前面最大的
不会证
代码
T3
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+11;
long long n,k;
double f[N];
double s[N];
double H(long long x){return log(x)+0.5772156649+1.0/(2*x);}
int main()
{
FILE* p=freopen("game.in","r",stdin);
p=freopen("game.out","w",stdout);
cout.unsetf(ios::fixed);
cout.setf(ios::scientific);
cout.precision(9);
cin>>k>>n;
f[1]=1;
if(n<=1e6)
{
for(int i=2;i<=n;i++) f[i]=f[i-1]+1.0/i;
if(k==0)
{
cout<<f[n]<<endl;
return 0;
}
for(int i=1;i<=n;i++) s[i]=f[i];
for(int i=1;i<=k;i++)
{
double xx=0;
for(int j=1;j<=n;++j)
{
double tem=s[j];
s[j]+=xx;
xx+=tem;
}
}
cout<<s[n]<<endl;
return 0;
}
if(k==0)
{
cout<<H(n)<<endl;
return 0;
}
double kk=0;
long double ans=1;
for(int i=1;i<=k;++i) kk+=1.0/i;
for(long long i=1;i<=k;i++) ans*=(double)n/(double)i;
ans*=(H(n)-kk);
cout<<ans<<endl;
return 0;
}