记录编号 246913 评测结果 AAAAAAAAAA
题目名称 线型网络 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.692 s
提交时间 2016-04-07 17:21:56 内存使用 0.29 MiB
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cstring>
using std::cin;
using std::cout;
using std::swap;
using std::min;
const int MAXN=20+1;
struct P{
	double x,y;
}st[MAXN];
double ans=1000000,dt[MAXN][MAXN];
int table[MAXN],N;
inline void randp(){
	int a,b;
	for(int i=1;i<=100;i++) swap(table[rand()%N+1],table[rand()%N+1]);
}
inline void reverse(int i,int j){
	for(;i<j;i++,j--) swap(table[i],table[j]);
}
double curans(){
	double res=0;
	for(int i=1;i<N;i++) res+=dt[table[i]][table[i+1]];
	return res;
}
int main(){
	freopen("linec.in","r",stdin);
	freopen("linec.out","w",stdout);
	srand(time(NULL));
	cin>>N;
	for(int i=1;i<=N;i++) cin>>st[i].x>>st[i].y,table[i]=i;
	for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) dt[i][j]=sqrt((st[i].x-st[j].x)*(st[i].x-st[j].x)+(st[i].y-st[j].y)*(st[i].y-st[j].y));
	const int T=10000;
	for(int k=1;k<=T;k++){
		randp();
		for(int i=2;i<=N;i++) for(int j=i;j<=N-1;j++) 
			if(dt[table[i]][table[i-1]]+dt[table[j]][table[j+1]]>dt[table[i-1]][table[j]]+dt[table[i]][table[j+1]])
				 reverse(i,j);
		ans=min(curans(),ans);
	}
	cout.setf(std::ios::fixed);
	cout.precision(2);
	cout<<ans;
}