震惊,一份连样例都过不了的代码切掉了此题
查看原帖
震惊,一份连样例都过不了的代码切掉了此题
99506
_LHF_楼主2021/4/16 13:55
#include<cstdio>
#include<algorithm>
#define N 15
using namespace std;
int B,s,sum,m,f[(1<<13)+10][N][510],a[N],st,n,k,vis[N];
long long ans;
void dfs1(int x,int l,int s)
{
	sum+=s;
	if(sum>m){sum-=s;return;}
	if(x>=B)
	{
		f[st][k][m-sum]++;
		sum-=s;
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			vis[i]=1;
			st^=(1<<(i-1));
			if(!x) k=i;
			dfs1(x+1,i,max(s,a[l]+s-a[i]+(i>l)));
			st^=(1<<(i-1));
			vis[i]=0;
		}
	}
	sum-=s;
}
void dfs2(int x,int l,int s)
{
	sum+=s;
	if(sum>m){sum-=s;return;}
	if(x>=n-B)
	{
		for(int i=1;i<=n;i++)
			if(!vis[i]&&B*max(s,s+a[l]-a[i]+(i>l))+sum<=m)
				ans+=f[st][i][B*max(s,a[l]+s-a[i]+(i>l))+sum];
		sum-=s;
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			vis[i]=1;
			st^=(1<<(i-1));
			dfs2(x+1,i,s+max(0,a[l]-a[i]+(i>l)));
			st^=(1<<(i-1));
			vis[i]=0;
		}
	}
	sum-=s;
}
int bitcount(int x)
{
	int s=0;
	while(x)
	{
		s+=(x&1);
		x>>=1;
	}
	return s;
}
int w;
int main()
{
	scanf("%d%d",&n,&m);
	B=n/2;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]>a[w]) w=i;
	}
	dfs1(0,0,0);
	st=(1<<n)-1;
	for(int i=0;i<=st;i++)
	{
		if(bitcount(i)!=B) continue;
		for(int j=1;j<=n;j++)
			for(int k=m;k>=0;k--)
				f[i][j][k]+=f[i][j][k+1];
	}
	dfs2(0,w,0);
	printf("%lld",ans);
}
2021/4/16 13:55
加载中...