LK的旅行

时间限制:2000 ms  |  内存限制:65535 KB
难度:5
 
描述
LK最近要去某几个地方旅行,她从地图上计划了几个点,并且用笔点了出来,准备在五一假期去这几个城市旅行。现在希望你找出她点的所有的点中距离最远的两个点的距离是多少。各个景点可以认为是在一个平面上。
 
 
输入
第一行有一个整数0<n<10表示测试数据的组数随后的n组数据中,第一行有一个整数3<m<100000表示有m个旅游景点。随后的m行每行有两个整数,分别表示每一个点的x和y。景点坐标中可能有重复的,0<=x,y<=10000)
输出
每组数据输出距离最远的点对的距离的平方.
样例输入
  1. 1
  2. 4
  3. 0 0
  4. 1 1
  5. 0 1
  6. 1 0
样例输出
  1. 2
    代码:
  1. #include<iostream>
  2. #include<fstream>
  3. #include<algorithm>
  4. using namespace std;
  5. const int num=;
  6. int N;
  7. struct Point
  8. {
  9. int x;
  10. int y;
  11. }points[num],output[num];
  12. inline int ccw(Point p1,Point p2,Point p3) //交叉乘积
  13. {
  14. return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);
  15. }
  16. inline int dis(Point p1,Point p2) //距离
  17. {
  18. return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
  19. }
  20. int cmp(const void *po1,const void *po2) //排序用的比较函数
  21. {
  22. Point *p1=(Point *)po1;
  23. Point *p2=(Point *)po2;
  24. int temp=ccw(points[],*p1,*p2); //先判断方向
  25. if(temp>)
  26. {
  27. return -;
  28. }
  29. else if(temp<)
  30. {
  31. return ;
  32. }
  33. else
  34. {
  35. return dis(*p1,points[])-dis(*p2,points[]); //共线时按距离从大到校排序
  36. }
  37. }
  38.  
  39. int maxDist( )
  40. {
  41. int min_index=;
  42. for(int i=;i<N;i++)
  43. {
  44. if(points[i].x<points[min_index].x)
  45. min_index=i;
  46. else if(points[i].x<points[min_index].x&&points[i].y<points[min_index].y)
  47. min_index=i;
  48. }
  49. swap(points[],points[min_index]); //找到y坐标最小的点,并交换到第一个位置
  50. qsort(points+,N-,sizeof(Point),cmp); //排序
  51. /* for(int i=0;i<N;i++)
  52. {
  53. printf("%d %d\n",points[i].x,points[i].y);
  54.  
  55. }*/
  56. output[]=points[];
  57. output[]=points[];
  58. int top=;
  59. i=;
  60. while(i<N)
  61. {
  62. // printf("%d %d\n",points[i].x,points[i].y);
  63.  
  64. int temp=ccw(output[top-],output[top],points[i]);
  65. if(temp>=)
  66. {
  67. output[++top]=points[i];
  68. i++;
  69. }
  70. /*else if(temp==0)
  71. {
  72. output[top]=points[i];
  73. i++;
  74. }*/
  75. else
  76. {
  77. top--;
  78. }
  79. }
  80. int maxD=;
  81. for( i=;i<=top;i++) //计算边界点之间的距离
  82. {
  83. // printf("%d %d\n",output[i].x,output[i].y);
  84. for(int j=i+;j<=top;j++)
  85. {
  86. int temp=dis(output[i],output[j]);
  87. if(temp>maxD)
  88. maxD=temp;
  89. }
  90. }
  91. printf("%d\n",maxD);
  92. return maxD;
  93.  
  94. }
  95.  
  96. int main()
  97. {
  98. int T;
  99. scanf("%d",&T);
  100. while(T--) //输入
  101. {
  102. scanf("%d",&N);
  103. for(int i=;i<N;i++)
  104. {
  105. scanf("%d %d",&points[i].x,&points[i].y);
  106. //printf("%d %d\n",points[i].x,points[i].y);
  107. }
  108. maxDist();
  109. }
  110. return ;
  111. }

NYOJ-253 凸包的更多相关文章

  1. 圈水池 nyoj 78 凸包算法

    圈水池 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水, ...

  2. nyoj 253:LK的旅行 【旋转卡壳入门】

    题目链接 求平面最大点对. 找凸包 -> 根据凸包运用旋转卡壳算法求最大点对(套用kuang巨模板) 关于旋转卡壳算法 #include<bits/stdc++.h> using n ...

  3. NYOJ 78 圈水池 (入门级凸包)

    题目链接:nyoj 78  单调链凸包小结 题目讲解:本题考查的主要是凸包的用法,算是入门级的吧,当然前提是你接触过,平面几何: AC代码: #include<iostream> #inc ...

  4. SGU 253 Theodore Roosevelt 快速判断点是否在凸包内

    http://acm.sgu.ru/problem.php?contest=0&problem=253 题意简单易懂...给你n个点的凸包(经测试已经是极角序)...判断m个点是否在凸包内.. ...

  5. 题解报告:NYOJ #78 圈水池(打印凸包顶点)

    描述: 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水,各个水池都标有各自的坐标,现在要你写一个程序利用最短的篱笆将这些供水装置圈起来!( ...

  6. nyoj 78-圈水池 (凸包)

    78-圈水池 内存限制:64MB 时间限制:3000ms 特判: No 通过数:5 提交数:6 难度:4 题目描述: 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来, ...

  7. nyoj 78:圈水池 【凸包入门】

    题目链接 将所有点按从左至右顺序排序,然后将所有点先从左到右扫描再从右到左扫描,逐渐将凸包轮廓“勾勒”出来 (凸包轮廓满足,轮廓上连续的三个点按先后顺序给出的话呈逆时针方向) 最后删去一个重复的起(终 ...

  8. NYOJ-517 最小公倍数 TLE 分类: NYOJ 2013-12-29 14:49 253人阅读 评论(0) 收藏

    #include <stdio.h> int main(){ int num[101]={0}; int result[21]={0}; int sum[101][21]={0}; int ...

  9. Monotone Chain Convex Hull(单调链凸包)

    Monotone Chain Convex Hull(单调链凸包)算法伪代码: //输入:一个在平面上的点集P //点集 P 按 先x后y 的递增排序 //m 表示共a[i=0...m]个点,ans为 ...

  10. NYOJ 1007

    在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...

随机推荐

  1. UserLogin

    DAL: IUserDAL namespace Dal { /// <summary> /// This interface is defined for user functions. ...

  2. 定位表的数据块并且dump出来

    SQL> select * from city;         ID NAME ---------- ----------          7 Chicago          6 Jers ...

  3. 4-2.矩阵乘法的Strassen算法详解

    题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B ...

  4. windows2003服务器不显示桌面怎么办

    ctrl +alt+delete 进入任务管理器应用程序里 创建新任务 C:\WINDOWS\explorer.exe 运行就行

  5. iOS常见问题(4)

    一.非ARC内存管理问题. 有些同学在创建项目的时候忘记点ARC了,导致一些成员属性都莫名其妙的释放了.然后出现了一系列莫名其妙的错误. 在滚动UITableView的时候出现野指针错误. 一出现这些 ...

  6. SlimDx绘制点图元的问题

    问题:点图元在自己创建的三维环境里渲染不出来,代码如下: GMCustomVertex.PositionNormalColored wellPart = new GMCustomVertex.Posi ...

  7. LintCode-Majority Number

    Given an array of integers, the majority number is the number that occurs more than half of the size ...

  8. VS2010 配置opencv环境

    大家在使用opencv的时候肯定会面对这样一个问题:根据官网以及大多数教程提供的方法中,似乎每一次新建一个opencv的新项目以后都需要重新再配置"VC++目录"中的"包 ...

  9. php发送get、post请求的几种方法

    方法1: 用file_get_contents 以get方式获取内容 <?php $url='http://www.domain.com/'; $html = file_get_contents ...

  10. pos机套现是怎么回事

    POS机是商家为了促进消费,向银行申请的刷卡机它的主要功能是转账就是通过客户的刷卡,把相对的金额转入商户的帐户银行会根据笔数或金额向商户收取手续费非法套现就是客户并未和商户产生贸易往来,单纯通过pos ...