首页 > 其他 > 详细

HDU 1392 Surround the Trees

时间:2014-04-07 22:16:06      阅读:486      评论:0      收藏:0      [点我收藏+]

题解:计算凸包……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <cstdio> 
#include <cstring> 
#include <algorithm> 
#include <cmath>
using namespace std; 
struct node{int x,y;}vex[1005],stackf[1005];
bool cmp1(node a,node b){ 
    if(a.y==b.y)return a.x<b.x; 
    else return a.y<b.y; 
int cross(node a,node b,node c){return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}
double dis(node a,node b){return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y));}
bool cmp2(node a,node b){ 
    int m=cross(vex[0],a,b); 
    if(m==0)return dis(vex[0],a)-dis(vex[0],b)<=0?1:0; 
    else return m>0?1:0; 
int main(){ 
    int t; 
    while(scanf("%d",&t),t!=0){ 
        for(int i=0;i<t;i++)scanf("%d%d",&vex[i].x,&vex[i].y); 
        if(t==1)printf("%.2f\n",0.00); 
        else if(t==2)printf("%.2f\n",dis(vex[0],vex[1])); 
        else
            sort(vex,vex+t,cmp1); 
            sort(vex+1,vex+t,cmp2); 
            memset(stackf,0,sizeof(stackf)); 
            stackf[0]=vex[0]; stackf[1]=vex[1]; 
            int top=1; 
            for(int i=2;i<t;i++){ 
                while(i>=1&&cross(stackf[top-1],stackf[top],vex[i])<0)top--;     
                stackf[++top]=vex[i];  
        
        double s=0; 
        for(int i=1;i<=top;i++)s+=dis(stackf[i-1],stackf[i]); 
        s+=dis(stackf[top],vex[0]); 
        printf("%.2f\n",s); 
        
    
    return 0;
}

HDU 1392 Surround the Trees,布布扣,bubuko.com

HDU 1392 Surround the Trees

原文:http://www.cnblogs.com/forever97/p/3650021.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!