POJ 1228 Grandpa's Estate --深入理解凸包

题意: 判断凸包是否稳定。

解法: 稳定凸包每条边上至少有三个点。

这题就在于求凸包的细节了,求凸包有两种算法: 

1.基于水平序的Andrew算法

2.基于极角序的Graham算法

两种算法都有一个类似下面的语句:

for(int i=0;i<n;i++) {while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;ch[m++] = p[i];}

这样的话,求出来就是最简凸包,即点数尽量少的凸包,因为Cross == 0的情况也被出栈了,所以一条凸包边上就会三点共线了。

我们把语句改下,把Cross.. <=0  改成 Cross.. < 0 ,那么求的就是最繁凸包,即可能一条凸包边上包含很多点也属于凸包的点。

即下面的情况:

最简凸包即为蓝色的四个点。 最繁凸包求出的是所有蓝点和红点。

作为这个题,我们怎么求其实都可以:

1.如果求最简凸包,我们只需判断总共有多少个点在该凸包边上即可(端点也算),如果 < 3 ,则不符。

2.如果求的是最繁的凸包,就不能用上面的判法,因为怎么判都只有两个点了,这时候可以采用下面的方法:

假设要判断的边i,那么判断边i和边i-1,边i和边i+1的夹角是否都为0(180)。                                        ----XDruid

 

代码: (这里我用的是Andrew算法)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define eps 1e-8
using namespace std;struct Point{double x,y;Point(double x=0, double y=0):x(x),y(y) {}void input() { scanf("%lf%lf",&x,&y); }
};
typedef Point Vector;
int dcmp(double x) {if(x < -eps) return -1;if(x > eps) return 1;return 0;
}
template <class T> T sqr(T x) { return x * x;}
Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }
Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }
Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); }
Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); }
bool operator < (const Point& a, const Point& b) { return a.x < b.x || (a.x == b.x && a.y < b.y); }
bool operator >= (const Point& a, const Point& b) { return a.x >= b.x && a.y >= b.y; }
bool operator <= (const Point& a, const Point& b) { return a.x <= b.x && a.y <= b.y; }
bool operator == (const Point& a, const Point& b) { return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0; }
double Dot(Vector A, Vector B) { return A.x*B.x + A.y*B.y; }
double Length(Vector A) { return sqrt(Dot(A, A)); }
double Angle(Vector A, Vector B) { return acos(Dot(A, B) / Length(A) / Length(B)); }
double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }
double angle(Vector v) { return atan2(v.y, v.x); }bool OnSegment(Point P, Point A, Point B) {         //端点不算return dcmp(Cross(A-P,B-P)) == 0 && dcmp(Dot(A-P,B-P)) <= 0;
}
int ConvexHull(Point* p, int n, Point* ch) {sort(p,p+n);int m = 0;for(int i=0;i<n;i++) {while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;ch[m++] = p[i];}int k = m;for(int i=n-2;i>=0;i--) {while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;ch[m++] = p[i];}if(n > 1) m--;return m;
}
Point ch[1006],p[1006];int main()
{int t,n,i,j;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=0;i<n;i++) p[i].input();if(n <= 5) { puts("NO"); continue; }int m = ConvexHull(p,n,ch);if(m <= 2) { puts("NO"); continue; }for(i=0;i<m;i++) {int cnt = 0;for(j=0;j<n;j++)if(OnSegment(p[j],ch[i],ch[(i+1)%m]))cnt++;if(cnt < 3) break;}if(i == m) puts("YES");else       puts("NO");}return 0;
}
View Code

 

现在终于对自己的凸包版有了全面的了解了,妈妈再也不用担心我用错凸包了。哈哈。

转载于:https://www.cnblogs.com/whatbeg/p/4174944.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赵强老师免费公开课第一季:Hadoop的背景起源

标签&#xff1a;免费直播课 Hadoop 大数据 赵强原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://51edu.blog.51cto.com/8899635/1897555 Hadoop大数据免费公开课招募啦~~~赵强…

.NET Windows服务应用程序

此文旨在记录个人对windows服务的理解以及学习记录&#xff0c;高人可以直接绕行。 1.Windows 服务体系结构 http://technet.microsoft.com/zh-cn/library/aa998749(vexchg.65).aspx Windows 服务&#xff08;也称服务应用程序&#xff09;是无论用户是否登录都运行在 Windows …

bootstrap-代码-内联代码

说明通过 <code> 标签包裹内联样式的代码片段示例<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"view…

java类似php魔术方法_PHP与类有关的几个魔术方法

与类有关的其他魔术方法序列化与反序列化技术含义&#xff1a;序列化&#xff1a;就是将一个变量所代表的“内存”数据&#xff0c;转换为“字符串”形式并持久保存在硬盘上的一种做法。反序列化&#xff1a;就是将序列化之后保存在硬盘上的“字符串数据”&#xff0c;恢复为其…

IIS ARR设置HTTP跳转到HTTPS

GUI Version - Select the website you wish to configure- In the “Features View” panel, double click URL Rewrite You will notice there are currently no rules configured for this site. Click “Add Rules…” in the Actions menu to the right of the “Features…

AutoCAD.NET API 最新(2012)教程下载及在线视频教程DevTV

Autodek最近发布了基于最新版的AutoCAD 2012的.net API开发教程。基本内容包括&#xff1a; Overview of .NETPlugin BasicsUser InteractionDatabase fundamentalsDictionariesUser InterfaceEventsInputPoint MonitorJigs现在就可以从AutoCAD开发者中心下载&#xff0c; 看图…

install python_python install on windows 10

图 1官网2、下载安装包&#xff1a;图 2 Downloads – windows图 3选择版本图 4选择离线安装版本图 5保存下载文件—文件名自己可以修改可能有人看到windows 几个版本&#xff0c;对几个版本有迷惑的地方&#xff0c;解释图 6几个版本的差异说明文字解释&#xff1a;An e…

iOS开发常见错误

错误1&#xff1a; 1.1这种错误都是storyboard有问题 解决&#xff1a;当前storyboard的Custom Class是MJViewController&#xff0c;代码中MJViewController继承自UITableViewController。 而storyboard目前提供的是UIViewController&#xff0c;并没有为MJViewController提供…

windows bat 批处理 !vm 合并快播文件

今天简单的写了一个bat批处理文件 用来处理快播的p2p的文件&#xff0c;一般回事这样的目录 你可以下载如下代码 echo off for /r %%a in (.) do (echo %%acd %%acopy /b *.!mv test.rmvb ) pause保存为merge.bat&#xff0c;就可以执行了 代码解释&#xff1a; 扫描该目录下的…

sso接口的调用

之前一直想sso接口已经写好了&#xff0c;登录注册功能是怎么调用的呢&#xff1f;原来在登录注册的jsp页面实现的接口的调用&#xff0c;页面的校验和验证功能在jsp页面即可实现。 注册页面&#xff1a; <% page language"java" contentType"text/html; cha…

[逆向][Writeup]ISG2015 flagfinder - .NET程序逆向

这个题目同样是一道.NET的逆向题&#xff0c;.NET的逆向方法在之前的博文中已经介绍过&#xff0c;这里不做重复的说明。本题的源程序可以在我的github上下载&#xff1a;https://github.com/gsharpsh00ter/reverse 0x01 逆向 flagfinder为.NET编译的PE文件&#xff0c;用dnSpy…

java 编译原理 字符串_Java编译原理(javac)

Java中的编译分为两个部分&#xff1a;源码文件编译成字节码文件(前端编译)字节码文件被虚拟机加载以后编译成机器码(后端编译)对于开发来说接触的一般都是第一个步骤也就是源码编译成字节码文件(class文件)&#xff0c;第二个步骤开发几乎不会接触&#xff0c;因为这是虚拟机在…

sql2012一段时间无法连接报53错误

2019独角兽企业重金招聘Python工程师标准>>> 解决方案 在sqlserver网络配置下的msqlserver协议下改将ip3改成如下图所示 转载于:https://my.oschina.net/u/2511906/blog/840373

php生成图片验证码代码,PHP生成图片验证码以及点击切换的代码

这篇文章主要介绍了PHP生成图片验证码实例,同时介绍了点击切换(看不清&#xff1f;换一张)效果实现方法,需要的朋友可以参考下这里来看下效果:现在让我们来看下 PHP 代码<?php session_start();function random($len) {$srcstr "1a2s3d4f5g6hj8k9qwertyupzxcvbnm&quo…

php 字符型转变为数值,php怎么把字符串转换为数值?

php怎么把字符串转换为数值&#xff1f;下面本篇文章给大家介绍一下PHP把字符串转换为数值的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。PHP中的字符串可以很容易地转换成数值(float / int / double类型)。在大多数用例中&am…

解决rspec 生成报告时报utf-8错误的方法

找到gems\1.9.1\gems\rspec-core-2.14.3\lib\rspec\core\formatters\snippet_extractor.rb文件中的第27行&#xff1a; 在这边记录一下&#xff0c;防止以后再遇到。。。出现这个原因是因为ruby文件用utf-8格式的&#xff0c;但是源码都是GBK处理的&#xff0c;找到\lib\ruby\…

EFProf Entity Framework Profile 工具

SQL Server Profiler用来跟踪应用程序发送到SQL Server中的SQL语句&#xff0c;用于检测性能&#xff0c;查找问题。Entity Framework 也有它的跟踪工具EFProf&#xff0c;用于跟踪Entity Framework发送到SQL Server中的SQL语句。 首先在代码中添加对程序集HibernatingRhinos.P…

php面试中的问题,十个值得深思的PHP面试问题

十个值得深思的PHP面试问题过来人在以往的面试中总结的10个值得深思的 PHP 面试问题&#xff0c;希望对你现在的面试有用&#xff0c;少走弯路&#xff0c;更多内容请关注应届毕业生网!Q1第一个问题关于弱类型$str1 yabadabadoo;$str2 yaba;if (strpos($str1,$str2)) {echo &…

Android中ExpandableListView控件基本使用

本文採用一个Demo来展示Android中ExpandableListView控件的使用&#xff0c;如怎样在组/子ListView中绑定数据源。直接上代码例如以下&#xff1a; 程序结构图&#xff1a; layout文件夹下的 main.xml 文件源代码例如以下&#xff1a; <?xml version"1.0" encodi…

武林外史java游戏,武林外史_网络游戏专区_腾讯游戏频道

1 、武师用防御工具1) 武卫类> 用土布制作的防护工具。阶段图片名称说明1武威带所需功力值所需力量所需技艺所需体力所需智能所需敏捷性防御力防御成功率8013013021 %武威甲所需功力值所需力量所需技艺所需体力所需智能所需敏捷性防御力防御成功率4160150021 %武威长裤所需功…