mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
120ba634b8
3300-3399
50 lines
1.2 KiB
C++
50 lines
1.2 KiB
C++
#include <iostream>
|
|
#include <cmath>
|
|
#include <algorithm>
|
|
#include <string.h>
|
|
using namespace std;
|
|
const int MAXN = 501;
|
|
struct data { double x,y;
|
|
}p[MAXN];
|
|
inline double sqr(double x)
|
|
{
|
|
return x * x;
|
|
}
|
|
double dis(int a,int b)
|
|
{
|
|
return sqrt(sqr(p[a].x - p[b].x) + sqr(p[a].y - p[b].y));
|
|
}
|
|
bool cmp(data a,data b)
|
|
{
|
|
return a.x == b.x ? a.y < b.y : a.x < b.x;
|
|
}
|
|
int main()
|
|
{
|
|
int n;
|
|
double dp[MAXN][MAXN];
|
|
while (scanf("%d",&n) != EOF && n)
|
|
{
|
|
for (int i = 1;i <= n;i++)
|
|
scanf("%lf%lf",&p[i].x,&p[i].y);
|
|
sort(p,p+n+1,cmp);
|
|
memset(dp,0,sizeof(dp));
|
|
for (int i = 0;i <= n;i++)
|
|
for (int j = 0;j <= n;j++)
|
|
dp[i][j] = 1e20;
|
|
dp[0][0] = 0;
|
|
for (int i = 0;i < n;i++)
|
|
for (int j = 0;j <= i;j++)
|
|
{
|
|
dp[i+1][j] = min(dp[i+1][j],dp[i][j] + dis(i,i+1));
|
|
dp[i+1][i] = min(dp[i+1][i],dp[i][j] + dis(j,i+1));
|
|
}
|
|
double ans = 1e20;
|
|
for (int i = 0;i <= n;i++)
|
|
{
|
|
if (dp[n][i] + dis(i,n) < ans)
|
|
ans = dp[n][i] + dis(i,n);
|
|
}
|
|
printf("%.2lf\n",ans);
|
|
}
|
|
}
|