题目:Grandpa's Estate

 

题意:输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定。所谓稳

定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点。

 

分析:容易知道,当一个凸包稳定时,凸包的每条边上都要有至少三个点,若只有两个点,则可以增加一个点,得到更大的凸

包。这样我们可以求出凸包,在求凸包时把共线的点也加进来,这样我们就判断是否有连续的三点共线即可,具体参见代码。

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
using namespace std;
const int N = 40005;
typedef double DIY;
struct Point
{
DIY x,y;
};
Point p[N];
Point stack[N];
Point MinA;
int top;
DIY dist(Point A,Point B)
{
return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}
DIY cross(Point A,Point B,Point C)
{
return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);
}
bool cmp(Point a,Point b)
{
DIY k=cross(MinA,a,b);
if(k>0) return 1;
if(k<0) return 0;
return dist(MinA,a)<dist(MinA,b);  //这里共线的点按距离从小到大排序
}
void Graham(int n)
{
int i;
for(i=1; i<n; i++)
if(p[i].y<p[0].y||(p[i].y==p[0].y&&p[i].x<p[0].x))
swap(p[i],p[0]);
MinA=p[0];
sort(p+1,p+n,cmp);
stack[0]=p[0];
stack[1]=p[1];
top=1;
for(i=2; i<n; i++)
{
//注意这里我们把共线的点也压入凸包里
while(cross(stack[top-1],stack[top],p[i])<0&&top>=1) --top;
stack[++top]=p[i];
}
}
bool Judge()
{
for(int i=1;i<top;i++)
{
//判断凸包的一条边上是否至少有3点
if((cross(stack[i-1],stack[i+1],stack[i]))!=0&&(cross(stack[i],stack[i+2],stack[i+1]))!=0)
return false;
}
return true;
}
int main()
{
int t,n,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
if(n<6)
{
puts("NO");
continue;
}
Graham(n);
cout<<endl;
for(i=0;i<n;i++)
cout<<p[i].x<<" "<<p[i].y<<endl;
cout<<endl;
for(i=0;i<=top;i++)
cout<<stack[i].x<<" "<<stack[i].y<<endl;
if(Judge()) puts("YES");
else        puts("NO");
}
return 0;
}

POJ1228(稳定凸包问题)相关推荐

  1. “稳定”凸包----poj1228

       题目链接: http://poj.org/problem?id=1228    这道题算是很好的一道凸包的题吧,做完后会加深对凸包的理解.    题意很关键...这英语看了好几遍才差不多看明白了 ...

  2. POJ 1228 —— “稳定”凸包

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

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

    题意: 判断凸包是否稳定. 解法: 稳定凸包每条边上至少有三个点. 这题就在于求凸包的细节了,求凸包有两种算法: 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类 ...

  4. 凸包 初学 Andrew 和 Melkman (模板) 旋转卡(qia)壳(ke)

    凸包初学 定义: 给你n个散落的点,让你求出最小的凸多边形将所有的点包括起来,或者点在边上. 稳定凸包,不能再扩充,每条边都用3个点 必备知识: 会用叉积判断点与直线的关系(这里指 点在线的那一边, ...

  5. POJ1228 Grandpa's Estate

    题目: http://poj.org/problem?id=1228 题意: 给一堆点,是原凸包边上的点或内部的点(内部的点表明凸包被切割): 问能这些点能否唯一确定原来这个凸包 分析: 这是一个稳定 ...

  6. Grandpa's Estate (凸包)

    传送门 Being the only living descendant of his grandfather, Kamran the Believer inherited all of the gr ...

  7. 利用计算机技术实现对文本篇章,自然语言处理NLP学习笔记一:概念与模型初探...

    前言 先来看一些demo,来一些直观的了解. 自然语言处理: 可以做中文分词,词性分析,文本摘要等,为后面的知识图谱做准备. 知识图谱: 还有2个实际应用的例子,加深对NLP的理解 九歌机器人: 微软 ...

  8. 《软件架构设计》一书目录

    第一部分  软件架构概念与思想篇 1 第1章  解析软件架构概念 3 1.1  软件架构概念的分类 3 1.1.1  组成派 4 1.1.2  决策派 5 1.2  软件架构概念大观 5 1.2.1  ...

  9. uvalive4838(凸包+重心)

    题意: 给出一个n边形,我们要输出有多少种摆放方案使得这个多边形能够稳定摆放(如果重心落在边的端点上,不能稳固). 思路: 用这n个点围成一个凸包,每次用凸包的一个边当做底边,判断重心是否落在这条边的 ...

最新文章

  1. iOS开发系列--让你的应用“动”起来
  2. CentOS-7.2部署Squid服务
  3. 几种常见的Shell
  4. ueditor单图上传iframe跨域_UEditor单图上传(simpleupload)跨域问题解决方案
  5. 【Python】文件的使用
  6. 关于JWT你要知道的都在这里
  7. Activity与AppCompatActivity全屏实现方法
  8. xapian_binaries
  9. Listings of System and Object Privileges--系统和对象权限列表
  10. ae导出gif插件_AE脚本-快速输出GIF动图格式插件脚本 GifGun 1.7.7 Win/Mac 支持AE CC 2019...
  11. 碎片化时间学习,这几个在线视频学习网站值得拥有!
  12. 怎么通过Unity使用Vulkan API 移动端Vulkan GPU 大PK
  13. js区分单击双击,双击不会触发单击事件
  14. Windows的消息定义大全
  15. 机器学习-Sklearn-07(无监督学习聚类算法KMeans)
  16. 学习《Redis设计与实现》Chapter2
  17. 用ffmpeg+nginx+海康威视网络摄像头rtsp在手机端和电脑端实现直播
  18. fedora 笔记本安装_漂亮的超薄笔记本电脑,令Fedora焕发光芒
  19. 群联PS3109固态硬盘掉固件识别为20M问题原因及解决方法
  20. 管理经济分析04:经典博弈论问题及举例

热门文章

  1. 观察者模式的应用场景
  2. 茅塞顿开:Spring Aware原理解析
  3. 上传问题分析2--文件重名
  4. plsql(轻量版)_异常处理机制
  5. linux将变量保存生成txt,linux-将输出命令保存在变量中并写入for循环
  6. 210506阶段四Python基本语法
  7. Cortex-M3-建立向量表
  8. 【C语言位运算的应用】如何按bit位翻转一个无符号整型
  9. [转]VSTO Office二次开发应用程序键盘鼠标钩子
  10. router3 BGP1 基础部分