很奇怪的wa4 90分
查看原帖
很奇怪的wa4 90分
733037
Cosysl楼主2024/5/28 19:49
#include<bits/stdc++.h>
#define int long long
// #define double long double
const int N=20;
double f[1<<N][N];
int n;
double d;
int a[N],b[N];
int c[N][N];
double dis[N][N];
double ans=1e9;
int mul(int x){
	return x*x;
}
int diss(int x1,int y1,int x2,int y2){
	return mul(x1-x2)+mul(y1-y2);
}
void solve(){
	std::cin>>n>>d; 
	for(int i=0;i<n;i++){
		std::cin>>a[i]>>b[i];
	}
	memset(f,0x7f,sizeof f);
	memset(dis,0x7f,sizeof dis);
	for(int i=0;i<n;i++){
		dis[i][i]=0.0;
		for(int j=0;j<n;j++){
			double t=sqrtl(diss(a[i],b[i],a[j],b[j]));
			if(t<=d)dis[i][j]=t;
		}
	}
	for(int k=0;k<n;k++){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				dis[i][j]=std::min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
	f[1][0]=0.0;
	for(int i=1;i<(1<<n);i++){
		for(int j=0;j<n;j++){
			if(i&(1<<j)){
				for(int k=0;k<n;k++){
					if(k!=j && (i&(1<<k)) ){
						f[i][j]=std::min(f[i][j],f[i-(1<<j)][k]+dis[j][k]);
					}
				}
			}
			
		}
	}

	for(int i=0;i<n;i++){
		ans=std::min(ans,f[(1<<n)-1][i]+dis[i][0]);
	}
	std::cout<<ans;
}
signed main(){
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);std::cout.tie(0);
	std::cout<<std::fixed<<std::setprecision(2);
	int _=1;
	//std::cin>>_;
	while(_--)solve();
} 

if(k!=j && (i&(1<<k)) && dis[j][k]<=d) 在我判断转移条件中多了一句dis[j][k]<=d就变成90,删掉就是100?

2024/5/28 19:49
加载中...