80分求助,double精度出错
  • 板块P1433 吃奶酪
  • 楼主qiucr
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/19 17:33
  • 上次更新2023/11/19 19:20:48
查看原帖
80分求助,double精度出错
1036832
qiucr楼主2023/11/19 17:33
输入
11
-1 -1
100 100
-1 0
1 1
-1 1
2 2
0 -1
3 3
0 1
1 -1
1 0

输出答案
148.01
我的
149.01



#include<bits/stdc++.h>
using namespace std;
typedef pair<double,double> PDD;
const int N=20,M=1<<N;
PDD d[N];
#define x first
#define y second
double f[M][N],w[N][N],ans=35000;
double dis(int i,int j){
	return (double)sqrt((double)(d[i].x-d[j].x)*(d[i].x-d[j].x)+(double)(d[i].y-d[j].y)*(d[i].y-d[j].y));
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
    	scanf("%lf%lf",&d[i].x,&d[i].y);
        ans=min(ans,dis(i,n));
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            w[i][j]=dis(i,j);
		}
    }
    for(int i=0;i<1<<n;i++){
    	for(int j=0;j<n;j++){
    		f[i][j]=35000;
		}
	}
	f[1][0]=ans;
	for(int i=0;i<1<<n;i++){
		for(int j=0;j<n;j++){
			if(i>>j&1){
				for(int k=0;k<n;k++){
					if(i>>k&1){
						f[i][j]=min(f[i][j],f[i-(1<<j)][k]+w[k][j]);
					}
				}
			}
		}
	}
	double res=35000;
	for(int i=0;i<n;i++) res=min(res,f[(1<<n)-1][i]);
	printf("%.2lf",res);
	return 0;
}
2023/11/19 17:33
加载中...