求助,卡#5wa 90分
  • 板块P1433 吃奶酪
  • 楼主inferno
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/8/16 12:03
  • 上次更新2023/11/6 20:08:25
查看原帖
求助,卡#5wa 90分
272819
inferno楼主2020/8/16 12:03
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
double a[65536][16], len = 0, as[16][16];
int n, s = 1;
struct node {
	double x, y;
}nmd[16];
void az(int level, int il, double lenl) {
	if (level >= n) {
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (((1 << i) & s) / pow(2, i) == 1 || i == il) {
			continue;
		}
		if (as[il][i] == 0) {
			len += as[i][il];
		}
		else {
			len += as[il][i];
		}
		s += pow(2, i);
		if (len <= a[s][i] || a[s][i] == 0) {
			a[s][i] = len;
		}
		else {
			len = lenl;
			s -= pow(2, i);
			return;
		}
		az(level + 1, i, len);
		s -= pow(2, i);
		len = lenl;
	}
}
int main()
{
	int count;
	double sa;
	cin >> n;
	for (count = 1; count <= n; count++) {
		cin >> nmd[count].x >> nmd[count].y;
	}
	for (int x = 0; x <= n; x++) {
		for (int y = x + 1; y <= n; y++) {
			as[x][y] = pow(pow(nmd[x].x - nmd[y].x, 2) + pow(nmd[x].y - nmd[y].y, 2), 0.500);
		}
	}
	az(0, 0, 0);
	for (count = 0, s = 0; count <= n; count++) {
		s += pow(2, count);
	}
	for (count = 0, sa = 0; count <= n; count++) {
		if (a[s][count] < sa || sa == 0) {
			sa = a[s][count];
		}
	}
		cout << fixed << setprecision(2) << sa << endl;
}
2020/8/16 12:03
加载中...