poj 2079(旋转卡壳求解凸包内最大三角形面积)
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 9060 | Accepted: 2698 |
Description
Input
Output
Sample Input
3
3 4
2 6
2 7
5
2 6
3 9
2 0
8 0
6 5
-1
Sample Output
0.50
27.00
Source
旋转卡壳算法可以参见我的上一篇博客以及里面的链接:http://www.cnblogs.com/liyinggang/p/5431908.html
题意:求解平面中的点中任意取三个能够形成最大的三角形面积。
题解:先用凸包把所有可能的点选出来,最大三角形必定是由凸包上的三点形成。
我们枚举底边,于是我们可以的到以下两种情况:
1.此三角形的底边在凸包上,求得次边对应的最远的点(不是对踵点),由于凸包是个单峰函数,所以只要找到第一个这个点比上一个点
大就找到了。记录下此时的面积(对应黄色线条).
2.如果三角形底边不再凸包上,我们利用同样的方法找到离此底边最远的点(对应红色线条)
aaarticlea/png;base64,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" alt="" width="183" height="207" />1,2相比,取大值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const int N = ;
struct Point{
int x,y;
}p[N],Stack[N];
int n; int mult(Point a,Point b,Point c){
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
int dis(Point a,Point b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int cmp(Point a,Point b){
if(mult(a,b,p[])>) return ;
if(mult(a,b,p[])==&&dis(b,p[])>dis(a,p[])) return ;
return ;
}
int Graham(){
sort(p+,p+n,cmp);
int top = ;
Stack[]=p[];
Stack[]=p[];
Stack[]=p[];
for(int i=;i<n;i++){
while(top>=&&mult(p[i],Stack[top],Stack[top-])>=){
top--;
}
Stack[++top]=p[i];
}
return top;
}
double rotating_calipers(int top){
int p=,q=; ///初始化
double ans = ;
Stack[++top]=Stack[];
for(int i = ;i<top;i++){
while(mult(Stack[i],Stack[p],Stack[q+])>mult(Stack[i],Stack[p],Stack[q])){
q= (q+)%top; ///定点i,p,q,先I,p固定,让q旋转找到最大的面积三角形,还是利用了凸包的单峰函数
}
ans = max(ans,mult(Stack[i],Stack[p],Stack[q])/2.0);
while(mult(Stack[i],Stack[p+],Stack[q])>mult(Stack[i],Stack[p],Stack[q])){
p=(p+)%top; ///i,q固定,p旋转,找到最大的三角形面积,比较记录.
}
ans = max(ans,mult(Stack[i],Stack[p],Stack[q])/2.0);
}
return ans;
}
int main()
{
while(scanf("%d",&n)!=EOF,n!=-){
for(int i=;i<n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
int k = ;
for(int i=;i<n;i++){
if(p[k].y>p[i].y||(p[k].y==p[i].y)&&(p[k].x>p[i].x)){
k=i;
}
}
swap(p[],p[k]);
int top = Graham();
double ans =rotating_calipers(top);
printf("%.2lf\n",ans);
}
return ;
}
poj 2079(旋转卡壳求解凸包内最大三角形面积)的更多相关文章
- poj 3608(旋转卡壳求解两凸包之间的最短距离)
Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9768 Accepted: ...
- Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离
\(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...
- Poj 2187 旋转卡壳
Poj 2187 旋转卡壳求解 传送门 旋转卡壳,是利用凸包性质来求解凸包最长点对的线性算法,我们逐渐改变每一次方向,然后枚举出这个方向上的踵点对(最远点对),类似于用游标卡尺卡着凸包旋转一周,答案就 ...
- POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
链接: http://poj.org/problem?id=2187 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- poj 2187 Beauty Contest , 旋转卡壳求凸包的直径的平方
旋转卡壳求凸包的直径的平方 板子题 #include<cstdio> #include<vector> #include<cmath> #include<al ...
- UVa 1453 - Squares 旋转卡壳求凸包直径
旋转卡壳求凸包直径. 参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html #include <cstdio> ...
- bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包
[HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 2081 Solved: 920 ...
- poj 2079 Triangle (二维凸包旋转卡壳)
Triangle Time Limit: 3000MS Memory Limit: 30000KB 64bit IO Format: %I64d & %I64u Submit Stat ...
- POJ 2187 - Beauty Contest - [凸包+旋转卡壳法][凸包的直径]
题目链接:http://poj.org/problem?id=2187 Time Limit: 3000MS Memory Limit: 65536K Description Bessie, Farm ...
随机推荐
- Centos7安装Redis4.0.8
今天安装了CentOS7 1708 在安装redis时报错 make[1]: *** [adlist.o] 错误 127 因为Redis是C实现的,需要gcc来进行编译,所以原因是系统未安装gcc, ...
- 博客存档TensorFlow入门一 1.4编程练习
import tensorflow as tf import numpy import matplotlib.pyplot as plt #from sklearn.model_selecti ...
- 【luogu P1850 换教室】 题解
题目链接:https://www.luogu.org/problemnew/show/P1850 难的不在状态上,难在转移方程. (话说方程写错居然还有84分= =) #include <cst ...
- UVA - 1160(简单建模+并查集)
A secret service developed a new kind of explosive that attain its volatile property only when a spe ...
- Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)
在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...
- NSDate|NSTimeZone|时区|日历
NSDate,NSDateFormatter以及时区转换-开发者-51CTO博客 iOS 时区转换 东八区 - 简书 iOS时间的时区转换以及一些方法记录 - 简书 iOS - OC NSTimeZo ...
- Python-常见错误梳理
1. takes exactly 1 argument (2 given) 出现此错误一般是在某对象调用类的某方法时出现.因为在python中某类的实例对象调用方法时,是首先将自身作为一个参数传入此方 ...
- Java---Huffman树的实现
什么是哈弗曼树 1.哈弗曼树是最优二叉树,树的带权路径长度最小的一个二叉树. 2.带权路径长度为根节点到该节点的路径长度和该节点权重的乘积.3.路径长度为当前节点到另一个节点所经过的分支的个数(边的个 ...
- (二)ubuntu下安装Amd RX470驱动
0X:ADM官方下载驱动 https://www.amd.com/en/support 查看本机驱动命令 lspci | grep -i vga 选择自己的驱动 下载对应的版本 现在最新的是:amdg ...
- jar下载地址
java开发难免需要下载额外的jar,推荐一个地址 http://www.java2s.com/Code/Jar/CatalogJar.htm