RE求调
  • 板块P1433 吃奶酪
  • 楼主Nervegas
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/17 19:55
  • 上次更新2024/6/17 22:32:57
查看原帖
RE求调
1206518
Nervegas楼主2024/6/17 19:55
#include<bits/stdc++.h>
using namespace std;
double dis[20][20];//i到j的距离;
double x[20],y[20];//走到i个奶酪时此时二进制状态的十进制j时的最小距离 
double f[18][30000];
long long n;
double distance111(int a,int b){
	return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) *(y[a] - y[b]));
} 
int main(){
	cin >> n;
	memset(f,127,sizeof(f));
	double ans = f[0][0];
	for(int i = 1 ; i <= n ; i++){
		cin >> x[i] >> y[i];
	}
	x[0] = 0;
	y[0] = 0;
	for(int i = 0 ; i <= n ; i++){
		for(int j = 0 ; j <= n ; j++){
			dis[i][j] = distance111(i,j);
			dis[j][i] = dis[i][j];
		}
	}
	for(int i = 0 ; i <= n ; i++){
		f[i][(1 << (i - 1))] = dis[0][i];//只走一个奶酪时距离就是距离原点的距离; 
	}
	for(int i = 1 ; i < (1 << n) ; i++){//二进制状态 
		for(int j = 1 ; j <= n ; j++){
			if((i & (1 << (j - 1))) == 0){
				continue;//没走过; 
			}
			for(int k = 1 ; k <= n ; k++){
				if(j == k){
					continue;
				}
				if((i & (1 << (k - 1))) == 0){
					continue;//没走过 
				}
				f[j][i] = min(f[j][i],f[k][i - (1 << (j - 1))] + dis[j][k]);
			}
		} 
	}
	for(int i = 1 ; i <= n ; i++){
		ans = min(ans,f[i][(i << n) - 1]);
	}
	printf("%.2f\n",ans);
	return 0;
} 
2024/6/17 19:55
加载中...