2 3 0 0 1 1 2 2 4 0 0 0 2 2 1 1 1
Case 1: No Solution Case 2: 4.650
计算几何,直接爆搜O(N^3)复杂度,肯定过不了,可以按照x坐标排序,加上优化,代码中判断能否组成三角形的代码,判断三点共线One_Line()可以 当做模板记忆
#include<algorithm> #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<cmath> using namespace std; const double Inf=100000000.0; const double Eps=1e-8; double juli(double x1,double y1,double x2,double y2){ return (sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))); } struct point{ int x; int y; }p[1000+10]; bool cmp(point a,point b){ return a.x<b.x; } bool One_Line(const point& s1,const point& s2,const point& s3) { return (s2.y-s1.y)*(s3.x-s2.x) == (s3.y-s2.y)*(s2.x-s1.x); } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T,n,i,j,x,y,count=1; cin>>T; while(T--){ cout<<"Case "<<count++<<": "; cin>>n; for(i=0;i<n;i++){ cin>>p[i].x>>p[i].y; } sort(p,p+n,cmp); double mini=Inf; int flag =0; for(i=0; i<n; i++){ for(j=i+1; j<n; j++){ if(mini <= 2*( p[j].x - p[i].x) )break; // 横坐标的差大于周长的一半,因为横坐标差都大于周长的一半了,那么三角形的一边肯定大于周长的一半 double a1=juli(p[i].x,p[i].y,p[j].x,p[j].y); if(mini<=2*a1)continue;//这里同理 for(int k=j+1;k<n;k++){ if(mini<=2*(p[k].x-p[j].x))break; if(One_Line(p[i],p[j],p[k]))continue; double a2=juli(p[j].x,p[j].y,p[k].x,p[k].y); double a3=juli(p[k].x,p[k].y,p[i].x,p[i].y); if(a1+a2+a3<mini){ mini=a1+a2+a3; flag=1; } } } } if(flag){ printf("%.3lf\n",mini); } else cout<<"No Solution"<<endl; } return 0; }
hdu 3548 最小三角形周长(计算几何),布布扣,bubuko.com
原文:http://blog.csdn.net/xiangguangde/article/details/23557637