HDU 1392 凸包周长
题意:给出若干个点,求一个周长最大的凸包,并给出周长。
思路:突进法,套板子(逃) 有空再回来补充原因
AC code:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 110;
const double eps = 1e-10;
struct Point{
double x,y;
};
Point p[maxn];
int ver[maxn];
inline double dis(const Point &a,const Point &b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
inline double xmul(const Point &p1,const Point &p2,const Point &p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
void solve(Point p[],int n){
int t=1;
for(int i=1;i<=n;++i){
if(p[i].y < p[t].y){
t = i;
}
}
ver[1] = t;
int num = 1;
do{
++num;
t = ver[num-1]+1;
if(t>n) t = 1;
for(int i=1;i<=n;++i){
double tmp = xmul(p[i],p[t],p[ver[num-1]]);
if(tmp<0) t=i;
}
ver[num]=t;
}while(ver[num]!= ver[1]);
double ans=0;
for(int i=1;i<num;++i){
ans += dis(p[ver[i]],p[ver[i+1]]);
}
printf("%.2lf\n",ans);
}
int main(){
int n;
while(~scanf("%d",&n)){
if(!n) break;
for(int i=1;i<=n;++i){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
if(n==1){
puts("0");
continue;
}
if(n==2){
printf("%.2lf\n",dis(p[1],p[2]));
continue ;
}
solve(p,n);
}
return 0;
}