求条,悬棺
查看原帖
求条,悬棺
1406678
hky_lightning楼主2024/7/27 16:51
#include<bits/stdc++.h>
#define ld double
using namespace std;
const int N=19;
ld ans,dp[1<<N][N],w[N][N];
int x[N],y[N],n,m;
ld  odj(int x,int y,int o,int p)
{
	return sqrt((x-o)*(x-o)+(y-p)*(y-p));
}
int Q(int x)
{
	int cnt=0;
	x=x>>n+1;
	for(;x;x-=(x&-x))
		cnt++;
	return cnt;
}
int main()
{
	for(int i=0;i<(1<<N);i++)
		for(int j=0;j<N;j++)
			dp[i][j]=1e9;
 	cin>>n>>m;
 	int i=1,g=n+m+1;
	for(i=1;i<=n;i++)
		cin>>x[i]>>y[i];
	for(;i<g;i++)
		cin>>x[i]>>y[i];
	for(i=0;i<=g;i++)
		for(int j=0;j<=g;j++)
			w[i][j]=odj(x[i],y[i],x[j],y[j]);
	dp[1][0]=0;
	for(int i=0;i<(1<<g);i++)
		for(int j=0;j<g;j++)			
			if((i>>j)&1)
				for(int k=0;k<g;k++)
					if(((i>>k)&1))
						dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k]+w[k][j]/(1<<Q(i^(1<<j))));
	int o=(1<<n+1)-1;
	ld ans=1e9;
	for(int i=0;i<(1<<m);i++)
	{
		for(int j=0;j<g;j++)
		{
			int x=o+(i<<(n+1));
//			cout<<bitset<sizeof(x)*8>(x);
//			printf(" %.7Lf %d\n",dp[o+(i<<(n+1))][j]+w[0][j]/(1<<Q(x)),Q(x));
			ans=min(ans,dp[x][j]+w[0][j]/(1<<Q(x)));
		}
	}	
	printf("%.10lf",ans);
	return 0;
}

WA on #5

2024/7/27 16:51
加载中...