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;
}
posted @ 2021-10-18 11:44  sitiy  阅读(22)  评论(0编辑  收藏  举报