poj2079Triangle(N点中三点组成三角形面积最大)

链接

根据旋转卡壳的思想,找到当前边的最远点。

确定i,j找到最远的k使 cross(i,j,k)最大,那么i,j+1时只需从k+1开始找即可 。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 50010
 12 #define LL long long
 13 #define INF 0xfffffff
 14 const double eps = 1e-8;
 15 const double pi = acos(-1.0);
 16 const double inf = ~0u>>2;
 17 struct point
 18 {
 19     int x,y;
 20     point(int x=0,int y=0):x(x),y(y) {}
 21 } p[N],ch[N];
 22 typedef point pointt;
 23 pointt operator - (point a,point b)
 24 {
 25     return point(a.x-b.x,a.y-b.y);
 26 }
 27 int dcmp(double x)
 28 {
 29     if(fabs(x)<eps) return 0;
 30     return x<0?-1:1;
 31 }
 32 double cross(point a,point b)
 33 {
 34     return 1.0*a.x*b.y-1.0*a.y*b.x;
 35 }
 36 double getarea(point a,point b,point c)
 37 {
 38     return fabs(cross(b-a,c-a))/2;
 39 }
 40 double mul(point p0,point p1,point p2)
 41 {
 42     return cross(p1-p0,p2-p0);
 43 }
 44 double dis(point a)
 45 {
 46     return sqrt(1.0*a.x*a.x+a.y*a.y);
 47 }
 48 bool cmp(point a,point b)
 49 {
 50     if(dcmp(mul(p[0],a,b))==0) return dis(a-p[0])<dis(b-p[0]);
 51     return dcmp(mul(p[0],a,b))>0;
 52 }
 53 int graham(int n)
 54 {
 55     int i,k=0,top;
 56     point tmp;
 57     for(i = 0;  i< n; i++)
 58     {
 59         if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))
 60             k = i;
 61     }
 62     if(k!=0)
 63         swap(p[0],p[k]);
 64     sort(p+1,p+n,cmp);
 65     ch[0] = p[0];
 66     ch[1] = p[1];
 67     top = 1;
 68     for(i = 2; i < n; i++)
 69     {
 70         while(top>0&&dcmp(mul(ch[top-1],ch[top],p[i]))<=0)
 71             top--;
 72         ch[++top] = p[i];
 73     }
 74     return top;
 75 }
 76 int main()
 77 {
 78     int n,i,j,k,kk;
 79     while(scanf("%d",&n)!=EOF)
 80     {
 81         if(n==-1) break;
 82         for(i = 0; i < n; i++)
 83             scanf("%d%d",&p[i].x,&p[i].y);
 84         int top = graham(n);
 85         double maxz=0,area;
 86     ++top;
 87     ch[top] = ch[0];
 88     for(i=0; i<top; ++i)
 89     {
 90         j=(i+1)%top;
 91         k=(j+1)%top;
 92         while(k!=i && getarea(ch[i],ch[j],ch[k])<getarea(ch[i],ch[j],ch[k+1]))
 93             k=(k+1)%top;
 94         maxz = max(maxz,getarea(ch[i],ch[j],ch[k]));
 95         if(k == i)
 96             continue;
 97         kk=(k+1)%top;
 98         while(j!=kk && k!=i)
 99         {
100             area=getarea(ch[i],ch[j],ch[k]);
101             if(area>maxz)
102                 area=maxz;
103             while(k!=i && getarea(ch[i],ch[j],ch[k])<getarea(ch[i],ch[j],ch[k+1]))
104                 k=(k+1)%top;
105             maxz = max(maxz,getarea(ch[i],ch[j],ch[k]));
106             j=(j+1)%top;
107         }
108     }
109     printf("%.2f\n",maxz);
110
111     }return 0;
112 }

poj2079Triangle(N点中三点组成三角形面积最大),布布扣,bubuko.com

时间: 2024-10-13 02:23:09

poj2079Triangle(N点中三点组成三角形面积最大)的相关文章

unity中三种调用其他脚本函数的方法

第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数 第三种,GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数 unity中三种调用其他脚本函数的

VMware中三种网络连接的区别

VMware中三种网络连接的区别 1.概述 2.bridged(桥接模式) 3.NAT(网络地址转换模式) 4.host-only(主机模式) 5.replicate physical network connection state 选项解释 1.概述 大家在安装完虚拟机后,默认安装了两个虚拟网卡,VMnet1和VMnet8,如下图.其中VMnet1是host网卡,用于host方式连接网络的.VMnet8是NAT网卡,用于NAT方式连接网络的.它们的IP地址是随机生成的. VMware提供了三

浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别

先做个简单的介绍,让先有个直观的认识 == equality 等同 === identity 恒等 == 两边值类型不同的时候,要先进行类型转换,再比较. === 不做类型转换,类型不同的一定不等. 举例说明: "1" == true 类型不同,"=="将先做类型转换,把true转换为1,即为 "1" == 1: 此时,类型仍不同,继续进行类型转换,把"1"转换为1,即为 1 == 1: 此时,"==" 左

文顶顶 iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用

本文主要解释下DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2_SKIPINSERTED的使用 实验环境: DB2 v9.7.0.6 AIX 6.1.0.0 採用默认的隔离级别CS STUDENT表的DDL与初始内容 CREATE TABLE "E97Q6C  "."STUDENT"  ( "AGE" INTEGER , "NAME" CHAR(8) ) IN "U

iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

解决mac pro中三指轻按翻译的功能不起作用

mac pro中三指轻按翻译的功能不起作用了,这是为什么呢? 快捷键如下: command+contral+d 原因是pro和air不一样,air默认是开着的,pro需要设置 系统偏好设置-> 触控板 -> 取消"用力点按和触觉反馈" -> 选中"查找与数据监测器"(可以看到有用三个手指轻按) 然后用3个手指轻按了,就会翻译了,而无需用control+command+d快捷键了

Android中三种超实用的滑屏方式汇总(转载)

Android中三种超实用的滑屏方式汇总 现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于前段时间项目的需要,所以也对其研究了一下,总的来说滑屏实现有三种方式:(至于其他的实现方式目前后还没碰到...) 1.ViewPager 2.ViewFlipper 3.ViewFlow 一.ViewPager 官方文档介绍:http://developer.android.com/reference/

也用 Log4Net 之将自定义属性记录到文件中 (三)

也用 Log4Net  之将自定义属性记录到文件中 (三)  即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑到了数据库记录方式,当然也一定考虑到了其它的记录方式.but how,how,how(这句话来源于电影功夫熊猫).接下来让我们看看如何将自定义属性记录到文件中. 上菜之前我先做个小补充,首先我们用到的消息载体依然是LogMessage,LogMessage类的代码可以查看"也用 Log4Net  之