题意:原来一个凸多边形删去一些点后剩n个点,问这个n个点能否确定原来的凸包(1 <= 测试组数t <= 10,1 <= n <= 1000)。

题目链接:http://poj.org/problem?id=1228

——>>初看这题,好别扭,不知道要做什么。。。

其实,是这样的:先求凸包,然后看凸包每一条边所在直线上有多少个点,至少需要3个。

假设一条边的所在直线只有2个点,那么可适当地在这两个点中间加一个或者几个点,使新图形仍是凸包,这时候就不能确定原来的凸包了。

假设一条边的所在直线上有3个以上的点,如果在其中两点间扩展一个点,所形成的图形是凹的,所以不能扩展,即边就确定了。

#include <cstdio>
#include <cmath>
#include <algorithm> using namespace std; const int maxn = 1000 + 10;
const double eps = 1e-10; int dcmp(double x){
if(fabs(x) < eps) return 0;
else return x < 0 ? -1 : 1;
} struct Point{
double x;
double y;
Point(double x = 0, double y = 0):x(x), y(y){}
bool operator < (const Point& e) const{
return x < e.x || (dcmp(x - e.x) == 0 && y < e.y);
}
}p[maxn], q[maxn]; typedef Point Vector; Vector operator + (Point A, Point B){
return Vector(A.x + B.x, A.y + B.y);
} Vector operator - (Point A, Point B){
return Vector(A.x - B.x, A.y - B.y);
} Vector operator * (Point A, double p){
return Vector(A.x * p, A.y * p);
} Vector operator / (Point A, double p){
return Vector(A.x / p, A.y / p);
} double Cross(Vector A, Vector B){
return A.x * B.y - B.x * A.y;
} 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;
} double ConvexPolygonArea(Point *p, int n){
double area = 0;
for(int i = 1; i < n-1; i++) area += Cross(p[i]-p[0], p[i+1]-p[0]);
return area / 2;
} int main()
{
int t, n;
scanf("%d", &t);
while(t--){
bool ok = 1;
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%lf%lf", &p[i].x, &p[i].y);
if(n < 3) ok = 0;
else{
int m = ConvexHull(p, n, q);
if(m < 6) ok = 0;
if(ok) for(int i = 2; i < m; i++){
if(dcmp(Cross(q[i] - q[i-1], q[i] - q[i-2])) != 0){
ok = 0;
break;
}
while(dcmp(Cross(q[i] - q[i-1], q[i] - q[i-2])) == 0) i++;
}
if(dcmp(ConvexPolygonArea(q, m)) == 0) ok = 0;
}
if(ok) puts("YES");
else puts("NO");
}
return 0;
}

poj - 1228 - Grandpa's Estate的更多相关文章

  1. POJ 1228 - Grandpa's Estate 稳定凸包

    稳定凸包问题 要求每条边上至少有三个点,且对凸包上点数为1,2时要特判 巨坑无比,调了很长时间= = //POJ 1228 //稳定凸包问题,等价于每条边上至少有三个点,但对m = 1(点)和m = ...

  2. POJ 1228 Grandpa's Estate(凸包)

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11289   Accepted: 3117 ...

  3. POJ 1228 Grandpa's Estate 凸包 唯一性

    LINK 题意:给出一个点集,问能否够构成一个稳定凸包,即加入新点后仍然不变. 思路:对凸包的唯一性判断,对任意边判断是否存在三点及三点以上共线,如果有边不满足条件则NO,注意使用水平序,这样一来共线 ...

  4. POJ 1228 Grandpa's Estate(凸包唯一性判断)

    Description Being the only living descendant of his grandfather, Kamran the Believer inherited all o ...

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

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

  6. 简单几何(求凸包点数) POJ 1228 Grandpa's Estate

    题目传送门 题意:判断一些点的凸包能否唯一确定 分析:如果凸包边上没有其他点,那么边想象成橡皮筋,可以往外拖动,这不是唯一确定的.还有求凸包的点数<=2的情况一定不能确定. /********* ...

  7. 【POJ】1228 Grandpa's Estate(凸包)

    http://poj.org/problem?id=1228 随便看看就能发现,凸包上的每条边必须满足,有相邻的边和它斜率相同(即共线或凸包上每个点必须一定在三点共线上) 然后愉快敲完凸包+斜率判定, ...

  8. poj 1228 稳定凸包

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12337   Accepted: 3451 ...

  9. poj1228 Grandpa's Estate

    地址:http://poj.org/problem?id=1228 题目: Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Tot ...

随机推荐

  1. Nginx 变量漫谈(三)

    也有一些内建变量是支持改写的,其中一个例子是 $args. 这个变量在读取时返回当前请求的 URL 参数串(即请求 URL 中问号后面的部分,如果有的话 ),而在赋值时可以直接修改参数串.我们来看一个 ...

  2. 什么是Intent(意图)

    1.Intent是一种运行时绑定(runtime bingding)机制,它能在程序运行的过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种 请求或者意愿,Android ...

  3. QT:轻松获取网页源码

    获取网页源码的小例子,代码很简单,就不多作解释了. 不过一定要注意网页的编码问题,否则会出现乱码的!!! #include <QtCore> #include <QtNetwork& ...

  4. 【关于360极速浏览器的xx极速模式自动切换到兼容模式】

    原理上是可以的. 1  360基于Chromium 开源浏览器内核,它本身就是一个壳子.. 2  7.0之后的极速浏览器,不支持 它官方的那个声明标记.<meta name=”renderer” ...

  5. GetModuleHandle,AfxGetInstanceHandle使用区别

    当一个文件被映射到调用进程的地址空间时,GetModuleHandle函数得到其中某一模块的句柄. 使用GetModuleHandle函数格式:HMODULE GetModuleHandle( LPC ...

  6. Node.js log1: ERR can not find module express

    1.win7下创建项目中提示输入的命令:cd project&&npm install    安装失败 输入上面提示的命令,预期结果:自动安装了依赖 ejs 和 express,失败提 ...

  7. linux之SQL语句简明教程---ALTER TABLE

    在表格被建立在资料库中后,我们常常会发现,这个表格的结构需要有所改变.常见的改变如下: 加一个栏位 删去一个栏位 改变栏位名称 改变栏位的资料种类 以上列出的改变并不是所有可能的改变.ALTER TA ...

  8. Quartz框架的使用

    专用词汇:scheduler:任务调度器trigger:触发器,用于定义任务调度时间规则job:任务,即被调度的任务misfire:错过的,指本来应该被执行但实际没有被执行的任务调度 Quartz核心 ...

  9. Xcoder 7.0 免证书真机测试

    相信大家已经看了WWDC大会上的内容了,在iOS9和Xcoder7.0以后真机测试不需要在购买付费账号了,(当然你要想上传appstore还是需要付费账号的). 今天我带大家来看下免证书的真机测试如何 ...

  10. IOS开发之——获取屏幕的尺寸及各模拟器代表的型号

    获取屏幕尺寸 [[[UIScreen mainScreen] currentMode].size.width]; [[[UIScreen mainScreen] currentMode].size.h ...