40分re求调
查看原帖
40分re求调
366316
桃雨凪丝楼主2022/7/14 16:03
#include<bits/stdc++.h>
#define I using
#define love namespace
#define oi std
I love oi;
typedef long long ll;
typedef double db;
#define re register int
#define ce continue
#define pf printf
#define sf scanf
#define inf 1e9+10
#define lim 100010
#define mod 998244353
//#define int ll
int gcd(int x,int y){return y?gcd(y,x%y):x;}
inline int rd(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0' || ch>'9'){if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
int n;
db x[20],y[20];
db dis(int x1,int y1,int x2,int y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
db dp[20][1<<18];
signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	//freopen(".in","r",stdin);	
	//freopen(".out","w",stdout);
	cin>>n;
	memset(dp,127,sizeof dp);

	for(int i=1;i<=n;i++)cin>>x[i]>>y[i],dp[1<<(i-1)][i]=sqrt(x[i]*x[i]+y[i]*y[i]);
	int mx=(1<<n)-1;
	
	for(int i=1;i<=mx;i++){
		for(int j=1;j<=n;j++){
			if((i&(1<<(j-1)))==0)ce;
		//	if(i==(1<<(j-1))) {dp[j][i]=0;ce;}
			for(int k=1;k<=n;k++){
				if(j==k)ce;
				if((i&(1<<(k-1)))==0) ce;
				dp[j][i]=min(dp[j][i],dp[k][i^(1<<(j-1))]+dis(x[k],y[k],x[j],y[j]));
			}
		}
	}
	db ans=10000000.0;
	for(int i=1;i<=n;i++){
		ans=min(ans,dp[i][(1<<n)-1]);
	}
	printf("%.2lf",ans);
	return 0;
}
2022/7/14 16:03
加载中...