ZOJ 2074 Trip

先求凸包再枚举包上的点对距离。

#include  < cstdio >
#include 
< string >
#include 
< cmath >
#include 
< algorithm >
using   namespace  std;

#define  eps 1e-10

typedef 
struct
{
    
double x, y;
    
int id;
}
 Point;
Point p[
30001 ];
int  N;
int  stack[ 30001 ];
int  used[ 30001 ];

int  cmp (  const  Point  & a,  const  Point  & b )
{
    
if ( a.y == b.y )
        
return a.x < b.x;
    
return a.y < b.y;
}


int  init ()
{
    
if ( scanf ( "%d"&N ) != 1 )
        
return 0;
    
int i;
    
for ( i = 0; i < N; i ++ )
        scanf ( 
"%lf%lf"&p[i].x, &p[i].y );
    sort ( p, p 
+ N, cmp );
    
for ( i = 0; i < N; i ++ )
        p[i].id 
= i;
    
return 1;
}


int  dCmp (  double  x )
{
    
if ( x < -eps )
        
return -1;
    
if ( x > eps )
        
return 1;
    
return 0;
}


double  crossDet ( Point  & a, Point  & b, Point  & c )
{
    
return dCmp ( ( b.x - a.x ) * ( c.y - a.y ) - ( c.x - a.x ) * ( b.y - a.y ) );
}


void  ps (  int  top )
{
    
int i;
    
for ( i = 0; i <= top; i ++ )
        printf ( 
"%d ", stack[i] );
    printf ( 
" " );
}


void  grahamScan ()
{
    memset ( used, 
0x00sizeof ( used ) );
    
int top;
    stack[
0= 0, stack[1= 1;
    top 
= 1;
    
int i;
    
for ( i = 2; i < N; i ++ )
    
{
        
if ( crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) >= 0 )
            stack[
++ top] = i;
        
else
        
{
            
while ( top > 0 && crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) < 0 )
                top 
--;
            stack[
++ top] = i;
        }

    }

    
for ( i = 0; i <= top; i ++ )
        used[p[stack[i]].id] 
= 1;
    
//ps ( top ); 
    for ( i = N - 1; i >= 0; i -- )
    
{
        
if ( used[i] )
            
continue;
        
if ( crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) >= 0 )
            stack[
++ top] = i;
        
else
        
{
            
while ( top > 0 && crossDet ( p[stack[top - 1]], p[stack[top]], p[i] ) < 0 )
                top 
--;
            stack[
++ top] = i;
        }

    }

    
//ps ( top );
    int j;
    
double max = 0;
    
for ( i = 0; i <= top; i ++ )
        
for ( j = 0; j <= top; j ++ )
        
{
            
double t = hypot ( p[stack[i]].x - p[stack[j]].x, p[stack[i]].y - p[stack[j]].y );
            max 
= max > t ? max : t;
        }

    printf ( 
"%.2f ", max );
}


void  proc ()
{
    
if ( N == 1 )
        printf ( 
"0.00 " );
    
if ( N == 2 )
        printf ( 
"%.2f ", hypot ( p[0].x - p[1].x, p[0].y - p[1].y ) );
    
if ( N >= 3 )
        grahamScan ();
}


int  main ()
{
    
//freopen ( "in.txt", "r", stdin );
    while ( init () )
    
{
        proc ();
    }

    
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值