2515: 【普及+/提高】【P1433】吃奶酪
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:1
解决:1
题目描述
房间里放着 块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 点处。
输入
第一行有一个整数,表示奶酪的数量 。
第 到第 行,每行两个实数,第 行的实数分别表示第 块奶酪的横纵坐标 。
输出
输出一行一个实数,表示要跑的最少距离,保留 位小数。
样例输入 复制
4
1 1
1 -1
-1 1
-1 -1
样例输出 复制
7.41
提示
数据规模与约定
对于全部的测试点,保证 ,,小数点后最多有 位数字。
提示
对于两个点 ,,两点之间的距离公式为 。
#include<bits/stdc++.h>
using namespace std;
int n;
double ans = DBL_MAX, f[16][33000] = {0};
struct point {
double x,y;
bool visit;
int num;
}ps[16];
double dis(point p1,point p2) {
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
void dfs (point p,int step,int mark,double s) {
if (step == n) {
if (s < ans ) ans = s;
return;
}
for(int i = 0; i < n; i++) {
if (ps[i].visit) continue;
int tmp = mark + (1<<i);
if (f[i][tmp] == 0 || f[i][tmp] > f[p.num][mark] + dis (ps[i],p)) {
f[i][tmp] = f[p.num][mark] + dis(ps[i],p);
ps[i].visit = true;
dfs(ps[i],step+1,tmp, s+dis(ps[i],p));
ps[i].visit = false;
}
}
}
int main(){
cin >> n;
for(int i = 0; i < n; i++) {
cin >> ps[i].x >> ps[i].y;
ps[i].visit = 0;
ps[i].num = i;
}
point p = {0,0,1,0};
dfs(p,0,0,0);
printf("%.2lf",ans);
return 0;
}