简单几何(求凸包点数) POJ 1228 Grandpa's Estate
题意:判断一些点的凸包能否唯一确定
分析:如果凸包边上没有其他点,那么边想象成橡皮筋,可以往外拖动,这不是唯一确定的。还有求凸包的点数<=2的情况一定不能确定。
- /************************************************
- * Author :Running_Time
- * Created Time :2015/11/4 星期三 10:24:45
- * File Name :POJ_1228.cpp
- ************************************************/
- #include <cstdio>
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <cstring>
- #include <cmath>
- #include <string>
- #include <vector>
- #include <queue>
- #include <deque>
- #include <stack>
- #include <list>
- #include <map>
- #include <set>
- #include <bitset>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- #define lson l, mid, rt << 1
- #define rson mid + 1, r, rt << 1 | 1
- typedef long long ll;
- const int N = 1e5 + 10;
- const int INF = 0x3f3f3f3f;
- const int MOD = 1e9 + 7;
- const double EPS = 1e-10;
- const double PI = acos (-1.0);
- int dcmp(double x) {
- if (fabs (x) < EPS) return 0;
- else return x < 0 ? -1 : 1;
- }
- struct Point {
- double x, y;
- Point () {}
- Point (double x, double y) : x (x), y (y) {}
- Point operator - (const Point &r) const {
- return Point (x - r.x, y - r.y);
- }
- bool operator < (const Point &r) const {
- return x < r.x || (x == r.x && y < r.y);
- }
- bool operator == (const Point &r) const {
- return dcmp (x - r.x) == 0 && dcmp (y - r.y) == 0;
- }
- };
- typedef Point Vector;
- Point read_point(void) {
- double x, y; scanf ("%lf%lf", &x, &y);
- return Point (x, y);
- }
- double dot(Point a, Point b) {
- return a.x * b.x + a.y * b.y;
- }
- double cross(Vector A, Vector B) {
- return A.x * B.y - A.y * B.x;
- }
- bool on_seg(Point p, Point a, Point b) {
- return dcmp (cross (a - p, b - p)) == 0 && dcmp (dot (a - p, b - p)) < 0;
- }
- /*
- 凸包边上无点:<= 凸包边上有点:<
- */
- vector<Point> convex_hull(vector<Point> ps) {
- sort (ps.begin (), ps.end ());
- int n = ps.size (), k = 0;
- vector<Point> qs (n * 2);
- for (int i=0; i<n; ++i) {
- while (k > 1 && cross (qs[k-1] - qs[k-2], ps[i] - qs[k-1]) <= 0) k--;
- qs[k++] = ps[i];
- }
- for (int t=k, i=n-2; i>=0; --i) {
- while (k > t && cross (qs[k-1] - qs[k-2], ps[i] - qs[k-1]) <= 0) k--;
- qs[k++] = ps[i];
- }
- qs.resize (k - 1);
- return qs;
- }
- int main(void) {
- int T; scanf ("%d", &T);
- while (T--) {
- int n; scanf ("%d", &n);
- vector<Point> ps;
- for (int i=0; i<n; ++i) ps.push_back (read_point ());
- if (n == 1) {
- puts ("NO"); continue;
- }
- vector<Point> qs = convex_hull (ps);
- if (qs.size () == n || qs.size () <= 2) {
- puts ("NO"); continue;
- }
- qs.push_back (qs[0]);
- int m = qs.size ();
- bool flag = false;
- for (int i=0; i<m-1; ++i) {
- flag = false;
- for (int j=0; j<ps.size (); ++j) {
- if (ps[j] == qs[i] || ps[j] == qs[i+1]) continue;
- if (on_seg (ps[j], qs[i], qs[i+1])) {
- flag = true; break;
- }
- }
- if (!flag) break;
- }
- if (flag) puts ("YES");
- else puts ("NO");
- }
- //cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
- return 0;
- }
简单几何(求凸包点数) POJ 1228 Grandpa's Estate的更多相关文章
- POJ 1228 - Grandpa's Estate 稳定凸包
稳定凸包问题 要求每条边上至少有三个点,且对凸包上点数为1,2时要特判 巨坑无比,调了很长时间= = //POJ 1228 //稳定凸包问题,等价于每条边上至少有三个点,但对m = 1(点)和m = ...
- POJ 1228 Grandpa's Estate --深入理解凸包
题意: 判断凸包是否稳定. 解法: 稳定凸包每条边上至少有三个点. 这题就在于求凸包的细节了,求凸包有两种算法: 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类 ...
- POJ 1228 Grandpa's Estate(凸包)
Grandpa's Estate Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11289 Accepted: 3117 ...
- POJ 1228 Grandpa's Estate 凸包 唯一性
LINK 题意:给出一个点集,问能否够构成一个稳定凸包,即加入新点后仍然不变. 思路:对凸包的唯一性判断,对任意边判断是否存在三点及三点以上共线,如果有边不满足条件则NO,注意使用水平序,这样一来共线 ...
- poj - 1228 - Grandpa's Estate
题意:原来一个凸多边形删去一些点后剩n个点,问这个n个点能否确定原来的凸包(1 <= 测试组数t <= 10,1 <= n <= 1000). 题目链接:http://poj. ...
- POJ 1228 Grandpa's Estate(凸包唯一性判断)
Description Being the only living descendant of his grandfather, Kamran the Believer inherited all o ...
- Codeforces 935 简单几何求圆心 DP快速幂求与逆元
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- 简单几何(数学公式+凸包) UVA 11168 Airport
题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为A ...
- 【POJ】1228 Grandpa's Estate(凸包)
http://poj.org/problem?id=1228 随便看看就能发现,凸包上的每条边必须满足,有相邻的边和它斜率相同(即共线或凸包上每个点必须一定在三点共线上) 然后愉快敲完凸包+斜率判定, ...
随机推荐
- DiscuzX程序升级教程_不知道关闭论坛的看过来
DiscuzX程序升级教程,不知道关闭论坛的朋友看过来,适用于 1.0, 1.5 2.0 , 2.5Beta, 2.5RC,2.5, 3.0 1)关闭论坛:后台- 全局- 站点信息- 是否关闭 :是 ...
- Antenna Placement(匈牙利算法 ,最少路径覆盖)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6991 Accepted: 3466 ...
- [Effective JavaScript 笔记]第17条:间接调用eval函数优于直接调用
eval函数不仅仅是一个函数.大多数函数只访问定义它们所在的作用域,而不能访问除此之外的作用域(词法作用域).eval函数具有访问调用它时的整个作用域的能力.编译器编写者首次设法优化js时,eval函 ...
- Nmap备忘单:从探索到漏洞利用(Part3)
众所周知NMAP是经常用来进行端口发现.端口识别.除此之外我们还可以通过NMAP的NSE脚本做很多事情,比如邮件指纹识别,检索WHOIS记录,使用UDP服务等. 发现地理位置 Gorjan Petro ...
- FZU 1649 Prime number or not米勒拉宾大素数判定方法。
C - Prime number or not Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- html 构建响应式网站之viewport的使用
在网页代码的头部,加入一行viewport元标签 <!DOCTYPE html> <html lang="en"> <head> <met ...
- Linux prerouting和postrouting的区别
我大概清楚一点就是从内网出去的时候用POSTROUTING进来的时候用PREROUTING,可是做透明代理的时候确是用PREROUTING.这是为什么呢? 回复: sunnygg pre还是post是 ...
- android设置图片自适应控件大小
在XML文件的ImageView属性中加上:android:scaleType="fitXY"
- July 28th, Week 31st Thursday, 2016
Time is a bird flying into eternity. 时间是一只永远在飞翔的鸟儿. Time waits for nobody. Vitality shows in not onl ...
- Java之IO操作总结
所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 ...