简单几何(求凸包点数) 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 随便看看就能发现,凸包上的每条边必须满足,有相邻的边和它斜率相同(即共线或凸包上每个点必须一定在三点共线上) 然后愉快敲完凸包+斜率判定, ...
随机推荐
- 微信成为首批支持iPhone 6s /Plus 上 3D Touch 功能的 App
2015苹果新品发布会上微信成为首批支持iPhone 6s 和 iPhone 6s Plus 上 3D Touch 功能的 App.通过 3D Touch,微信用户将可以通过更精减的操作完成基本任务, ...
- 是智能手机推动windows xp系统停止服务吗
昨天是windows xp系统停止服务的大限,各大媒体争相报道,漫天铺地的xp消息充斥网络,xp这个词的百度指数这段时间从4月1日的8411也开始猛涨,特别是这两天4月7日的36470飙升到4月8日的 ...
- redis和memcached比较
1.Memcached采用客户端-服务器的架构,服务器维护了一个键-值关系的数据表,服务器之间相互独立,互相之间不共享数据也不做任何通讯操作.客户端需要知道所有的服务器,并自行负责管理数据在各个服务器 ...
- poj1094 拓扑 Sorting It All Out
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29744 Accepted: 10 ...
- 在Android上使用fontAwesome
再也不用做那些讨厌的小图标了! 从网上找了些资料,总结下在android上使用fontAwesome的方法. 1.到官网上下载资源包,找到其中的字体文件fontawesome-webfont.ttf, ...
- python chm 中文帮助 (2.7 和 3.4)
sphinx-build 生成的(htmlhelp) 存在2个问题 1.生成的html 编码 cp2152,需要修改/sphinx/builders/html.py ctx['encoding'] = ...
- ubuntu下java环境变量配置
转自:http://blog.csdn.net/tenpage/article/details/7215810 如果是配置java环境,请参照这篇,更简单:在Ubuntu 12.04 LTS上安装JD ...
- HDU 4310 Hero (贪心算法)
A - Hero Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- linux编译中的常见问题
转linux编译中的常见问题 错误提示:Makefile:2: *** 遗漏分隔符 . 停止. 原因makefile中 gcc语句前 缺少一个 tab分割符 错误提示: bash: ./makefil ...
- ubuntu安装vmware tools
1.选择虚拟机菜单栏--安装VMware tools 选择你装虚拟机下的目录,点击 Linux.iso 再重新点击安装VMware Tools 这样会弹出一个包VMwareTools-9.6.0-1 ...