POJ 1228 —— “稳定”凸包

POJ 1228 Grandpa's Estate

这是个好题目,同时也是个不和谐的题目(不和谐原因是题目出的存在漏洞,数据弱,而且有些条件没给清楚,为了一个SB错误无限WA之后,终于AC)

 

题意就废了我好长时间,唉……英语不好的鸭梨大……

大意就是爷爷留了块土地给我,然而这块土地是以一些钉子来界定的,题目要做的就是给你一堆钉子的坐标(也就是凸包上部分的点),然后问你能不能唯一确定这块土地。

问了下度娘,这个问题叫做“稳定”凸包问题,那么首先就要了解下“稳定”凸包的性质:(在此感谢XDruid博主)

比方说有4个点:

这4个点可以围成一个凸包,但是原始的凸包可能并不是这个样子的

例如可能是这个样子:

这样我们则称这4个点确定的凸包是”不稳定“的!

那么怎么样才叫稳定呢?

是这个样子:想一想,若像刚才一样,在直线外面加一个点,那么线上的点必定不会属于凸包,要删掉,是吧?

如此以来,问题就很明确了,算法也随之而来了:

我们已经知道了怎么求凸包了(前提),这样一来,只要判断是否有3点或N>=3点共线就可以了~~

表示用的是Graham的变种Andrew……感觉真的很好用:

下面贴代码:

View Code
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;const double EPS = 1e-6;struct point{double x , y;
} p[1010] , chn[1010];bool cmp (point a , point b)
{return (a.y < b.y || (a.y == b.y && a.x < b.x));
}double xmult(point p1 , point p2 , point p3)
{return ((p1.x - p3.x) * (p2.y - p3.y) - (p1.y - p3.y) * (p2.x - p3.x));
}int andrew(int n)
{int len , top = 1;chn[0] = p[0];chn[1] = p[1];for (int i = 2 ; i < n ; i ++){while (top && xmult(p[i] , chn[top] , chn[top - 1]) > EPS) top --;chn[++ top] = p[i];}len = top;chn[++ top] = p[n - 2];for (int i = n - 3 ; i >= 0 ; i --){while (top != len && xmult(p[i] , chn[top] , chn[top - 1]) > EPS) top --;chn[++ top] = p[i];}return top;
}bool judge(int n)  //解释请看下面
{for (int i = 1 ; i < n ; i ++){if ((xmult(chn[i - 1] , chn[i] , chn[i + 1]) != 0) && (xmult(chn[i] , chn[i + 1] , chn[i + 2]) != 0))return false;}return true;
}int main()
{int T , n;scanf("%d" , &T);while (T --){scanf("%d" , &n);for (int i = 0 ; i < n ; i ++) scanf("%lf%lf" , &p[i].x , &p[i].y);if (n < 6) printf("NO\n");else{sort(p , p + n , cmp);int top = andrew(n);if (judge(top)) printf("YES\n");else printf("NO\n");}}return 0;
}

写了这个题后,对凸包的理解真是加深了。

同时,在被WA了N此后(主要是因为读入数据要用double。但是题目上说是整点啊!不明白,如果没看到别人的解题报告,估计要一直WA下去)

昨晚在无限WA后找了XxX师兄,开始以为思路错了,经过他的问答,对这个题目的理解更是加深了!

下面说下代码中【judge】函数的判断原因:

理论支持:叉积 = 0 说明共线!

我们用Andrew算法求出凸包后(栈内不删去共线的点)这些点已经是按一定顺序排好了的~

然后之需要对栈内的点进行叉积判断就可以了~~ 只有当向左与向中间扩展都不满足是,才说明当前点不满足!

所以只要有一个不满足,则说明全部不满足了。

 

做了这个题目,我对之前提出的疑问有了答案。哈哈~~

转载于:https://www.cnblogs.com/hmhard/archive/2013/02/07/2908860.html

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

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

相关文章

pythonflaskmock数据_Flask实现简单Mock Server

Mock Server充当的角色&#xff1a;Mock server在实际项目中的意义就相当于数据库。将我想要的数据返回给我就行&#xff0c;我并不关心你怎么逻辑处理的。一般的应用程序请求方式是GET和POST。Flask自带的request使用:request.url获取当前的请求url全路径地址&#xff0c;requ…

在Application_Error事件中获取当前的Action和Control

ASP.NET MVC程序处理异常时&#xff0c;方法有很多&#xff0c;网上也有列举了6种&#xff0c;下面是使用全局处理在Global.asax文件的Application_Error事件中实现。既然是ASP.NET MVC,我需要捕捉到Controller和Action名称。怎样实现可以参考下面代码&#xff1a; 程序运行结果…

android 真机 sqlite3,在android真机上使用sqlite3

#zijun#2013.10.29#QQ:223663737在android真机上使用sqlite3前期准备:1:保证手机已经ROOT操作步骤:1 : 打开CMD2 : 进入android linuxadb shell3 :切换到root权限su - root4 : 修改system目录为可读写权限mount -oremount,rw -t yaffs2 /dev/block/mtdblock3 /system5 :拷贝文件…

【ORACLE技术嘉年华PPT】MySQL压力测试经验

这是2013.11.18在第三届ORACLE技术嘉年华上的主题演讲PPT。点击这里&#xff1a;本地下载PPT。--------------------------------------分割线--------------------------------------知数堂 &#xff08;http://zhishuedu.com&#xff09;培训是由资深MySQL专家叶金荣、吴炳锡…

EditText 空指针问题

今天在Android中碰到了这样一个问题&#xff0c;其实应该很少人会碰到&#xff0c;因为只有像我这种奇葩才会犯这种错误。 但既然解决了&#xff0c;我就想在这里跟大家分享一下&#xff0c;毕竟它困扰了我一个白天啊。。。不多说了&#xff0c;看下面。。。 其实问题很简单&am…

ios跨线程通知_iOS多线程开发(三)---Run Loop(一)

Run LoopRun Loop就是一个事件处理的循环&#xff0c;用来不停的调动工作以及处理输入事件。使用Run Loop的目的就是节省CPU效率&#xff0c;线程在有工作的时候忙于工作&#xff0c;而没工作的时候处于休眠状态。一&#xff0c;Run Loop剖析Structure of a Run Loop and its s…

android播放flv,Android:从url播放flv视频流

我目前有一个应用程序&#xff0c;它可以记录视频并将其上传到我的服务器。在上传视频之后&#xff0c;应用程序会获得一个响应&#xff0c;该响应包含指向该文件的flv流的URL。Android&#xff1a;从url播放flv视频流当我尝试在android默认视频播放器(视频)中打开流时什么也没…

1.关于浏览器

一、认识主流浏览器 Chrome谷歌浏览器Safari苹果浏览器Firefox火狐浏览器Opera欧朋浏览器 二、浏览器内核是什么&#xff1f; 三、五大浏览器&#xff0c;四大内核 四、前端做网页开发用什么浏览器&#xff1f; Chrome谷歌浏览器。

About me [my way]

就要除夕了。假日的到来&#xff0c;心情瞬间就闲适了下来。早早上了床&#xff0c;看看电脑还有30%的电&#xff0c;想到一些事情&#xff0c;顺带纪录一下吧。 今年坚持上班到了除夕的前一天&#xff0c;爸妈来工作的城市陪我过年了。感谢他们。前几天就已经看帖子有说仍在上…

明天要中秋节了,先来到简单“类”的题目

2-1 Point类的定义 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握类与对象的定义&#xff1b; 设计一个点类Time&#xff0c;它具有私有数据成员x(横坐标)、y(纵坐标)&#xff1b;公有成员函数&#xff1a;SetPoint(int,int)用于设置点对象的值&…

实时数据交换平台 - BottledWater-pg with confluent

标签 PostgreSQL , Bottled Water , Kafka , Confluent , IoT 背景 想必大家都在图书馆借过书&#xff0c;小时候有好看的书也会在小伙伴之间传阅。 借书和数据泵有点类似&#xff0c;一份数据通过数据泵实时的分享给订阅者。 例如在IoT的场景中&#xff0c;有流式分析的需求&a…

科技鸿蒙系统一千章,第一千六百零七章 鸿蒙紫气,成圣之机 (上)

文学迷 > 玄幻魔法 > 天命神相 > 第一千六百零七章 鸿蒙紫气&#xff0c;成圣之机 (上)第一千六百零七章 鸿蒙紫气&#xff0c;成圣之机功德金身只要达到了八十一重天&#xff0c;大圆满的境界&#xff0c;实力堪混元大罗级别的圣人&#xff0c;这听起来确实是一件吊炸…

js reduce实现中间件_js数组高阶方法reduce经典用法代码分享

以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段&#xff0c;后续遇到其他使用这个函数的场景&#xff0c;将会陆续添加&#xff0c;这里作为备忘。javascript数组那么多方法&#xff0c;为什么我要单挑reduce方法&#xff0c;一个原因是我对这个…

struts2的s:iterator 标签 详解

struts2的s&#xff1a;iterator 可以遍历 数据栈里面的任何数组&#xff0c;集合等等 以下几个简单的demo&#xff1a;s:iterator 标签有3个属性&#xff1a; value&#xff1a;被迭代的集合 id &#xff1a;指定集合里面的元素的id status 迭代元素的索引1:jsp…

Protocol Buffers的应用

1. Protocol Buffers的介绍 Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then …

编程提高:一天一道编程题

1.文本操作 逆转字符串——输入一个字符串&#xff0c;将其逆转并输出。 拉丁猪文字游戏——这是一个英语语言游戏。基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay&#xff08;譬如“banana”会变成“anana-bay”&#xff09;。可以在维基百科上了…

android自验签名证书,没有以前的互联网连接,无法验证Android自签名证书

使用SSL基础架构&#xff1a;我们有一个有效的客户端/服务器设置,其中Android版本4.2和4.4的手机充当客户端,必须通过其自签名SSL证书验证服务器.问题&#xff1a;只要设备在尝试连接之前至少有一次互联网访问权限,服务器证书验证就会起作用.但是,如果执行恢复出厂设置且设备直…

asp.net缓存(二)

ASP.NET页面局部缓存 有时缓存整个页面是不现实的&#xff0c;因为页的某些部分可能在每次请求时都需要变化。在这些情况下&#xff0c;只能缓存页的一部分。顾名思义&#xff0c;页面部分缓存是将页面部分内容保存在内存中以便响应用户请求&#xff0c;而页面其他部分内容则为…

学习C# - Hello,World!

第一天学C#,开始学着写一些学习笔记&#xff0c;看了一下传智播客的视频&#xff0c;按照传智播客的教学顺序&#xff0c;开始学习。 class Program{static void Main(string[] args){Console.WriteLine("Hello World!");//自动添加回车换行Console.Write("Hell…

android获取button宽度,android – 如何获得Button的高度和宽度

我创建了一系列按钮.现在我想找到按钮的高度和宽度,为此我使用了getWidth()和getHeight().但问题是它总是返回0.为什么会发生这种情况&#xff1f;我发送了我的代码,请检查是否有任何问题.int x,y;LinearLayout layoutVertical (LinearLayout) findViewById(R.id.liVLayout);L…