例9.11 凸包的路径
  • 板块题目总版
  • 楼主wudaojiushu
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/27 21:17
  • 上次更新2023/11/27 23:11:32
查看原帖
例9.11 凸包的路径
725268
wudaojiushu楼主2023/11/27 21:17

题⽬描述 按顺时针给出一个凸多边形,任意两点间有一条直线边,求经过每个点恰好一次的最长不自交(和之前线段相交)路径

输⼊格式
第一行一个整数n,表示n个点。 接下来n 行,每行两个整数x,y,表示点的坐标
输出格式
输出最长不自交(和之前线段相交)路径长度,保留5位小数

样例数据
输入1
4
0 0
0 1
1 1
1 0
输出1
3.41421
数据规模与约定
对于100%的数据,1≤n≤2000,1≤x,y≤1000000000 求调

#include<bits/stdc++.h>  
using namespace std;  
int n;  
double f[5][2005],g[5][2005];  
struct node{  
	int x,y;  
}a[2005];  
double Pow(double x){  
	return x*x;  
}  
double dis(node a,node b){  
	return sqrt(Pow(a.x-b.x)+Pow(a.y-b.y));  
}  
int main(){  
	scanf("%d",&n);   
	for(int i=0;i<n;i++){  
		scanf("%d%d",&a[i].x,&a[i].y);  
	}  
	for(int j=1;j<n;j++){  
		for(int i=0;i<n;i++){  
			f[j%2][i]=max(f[(j-1)%2][(i+1)%n]+dis(a[i],a[(i+1)%n]),
						  g[(j-1)%2][(i+j)%n]+dis(a[i],a[(i+j)%n]));  
			g[j%2][i]=max(g[(j-1)%2][(i-1+n)%n]+dis(a[i],a[(i-1+n)%n]),
						  f[(j-1)%2][(i-j+n)%n]+dis(a[i],a[(i-j+n)%n]));  
		}  
	}  
	double ans=0;  
	for(int i=0;i<n;i++){  
		ans=max(ans,max(f[(n-1)%2][i],g[(n-1)%2][i]));    
	}  
	printf("%.5f",ans);  
	return 0;  
}
第一次放代码,轻喷QWQ
2023/11/27 21:17
加载中...