90分,有个点wa了,请大佬改改
  • 板块P1433 吃奶酪
  • 楼主amtuilasi
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/17 14:08
  • 上次更新2024/1/17 18:44:19
查看原帖
90分,有个点wa了,请大佬改改
1221266
amtuilasi楼主2024/1/17 14:08
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
#include<iomanip>

double a[21][21];//预处理表示两块奶酪之间的距离
double F[21][34000];//状态压缩数组
double x[21], y[21];//每块奶酪的位置坐标
int N;

double dis(int x1,int y1,int x2,int y2)
{
	return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

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 = i+1; j <= N; j++)
		{
			a[i][j] = dis(x[i], y[i], x[j], y[j]);
			a[j][i] = a[i][j];
		}
	}

	for (int i = 1; i <= N; i++)
	{
		F[i][1 << (i - 1)] = a[0][i];
	}

	for (int k = 1; k < (1 << N) ; k++)
	{
		for (int j = 1; j <= N; j++)
		{
			if ((k & (1 << (j - 1))) == 0)
			{
				continue;
			}
			for (int i = 1; i <= N; i++)
			{
				if (i == j)continue;
				if ((k & (1 << (i - 1))) == 0)
				{
					continue;
				}
				F[j][k] = min(F[j][k], F[i][k - (1 << (j - 1))] + a[i][j]);
			}
		}
	}

	

	for (int i = 1; i <= N; i++)
	{
		ans = min(ans, F[i][(1 << N) - 1]);
	}
	cout << setiosflags(ios::fixed);

	cout << setprecision(2) << ans << endl;

	return 0;
}
2024/1/17 14:08
加载中...