HDU4624:Endless Spin

89 篇文章 0 订阅
72 篇文章 0 订阅

题意:给定一个序列,每次随机覆盖一个区间(起点和长度均随机),求期望覆盖完整个序列长度。

min-max容斥,min(S)=n*(n+1)/2*sum(S),sum(S)表示至少包含S集合中一个点的区间数,可以考虑一个补集转化,求一个都不包含的区间数,发现就是sigma两个集合内点的区间数,那么就能dp了,f(i,j)表示上一个集合内点在i,一个都不包含区间数为j的贡献(根据min-max容斥的式子要对奇偶分正负),最后统计答案复杂度n^4+q*n^3。但这题卡精度要么用java要么手写高精度,所以我选择网上拖标算的表......

代码:

#include<bits/stdc++.h>
#define db long double
using namespace std;
const int N=55;

int n;
db f[N][N*N];

int g(int x)
{return x*(x+1)/2;}

void sol()
{
	n=50;
	for(int i=1,mx;i<=n;i++)
	{
		mx=g(i-1);
		f[i][mx]=1;
		for(int j=0;j<=mx;j++)
		{
			for(int nx=i+1;nx<=n;nx++)
			{
				f[nx][j+g(nx-i-1)]-=f[i][j];
			}
		}
	}

}

int main()
{
	const string ans[51]={"0","1.000000000000000","2.000000000000000","2.900000000000000","3.742063492063492","4.550782550782551","5.339458438877944","6.115568709170809","6.883515849207354","7.646001329298163","8.404742484047103","9.160864322251938","9.915122959697986","10.668037886196054","11.419972864667116","12.171186847949863","12.921866842501495","13.672149598205217","14.422136210550637","15.171902127505054","15.921504117722232","16.670985193367588","17.420378133764190","18.169708037741841","18.918994192607536","19.668251456354044","20.417491289207981","21.166722529914919","21.915951984406581","22.665184875333577","23.414425187561400","24.163675935274249","24.912939369587052","25.662217140708672","26.411510425169478","27.160820026039890","27.910146452156218","28.659489980948755","29.408850708402174","30.158228588875146","30.907623466896614","31.657035102590944","32.406463192027060","33.155907383511126","33.905367290628666","34.654842502675537","35.404332592986861","36.153837125570658","36.903355660372082","37.652887757430200","38.402432980138351"};  
	int T,tmp,tot;db res;
	sol();
	scanf("%d",&T);
	while(T--)
	{
		res=0;
		scanf("%d",&n),tot=g(n);
		cout<<ans[n]<<'\n';continue;
		for(int i=1,mx;i<=n;i++)
		{
			mx=g(i-1);
			for(int j=0;j<=mx;j++)
			{
				tmp=tot-(j+g(n-i));
				res+=f[i][j]*tot/tmp;
			}
		}
		printf("%.15Lf\n",res);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值