poj3348(凸包模板题)
Graham扫描法:参考博客
一开始以为找到一个顶点向右转弯时,把这个顶点抛出只抛出一个,WA了一直找不到bug,用随机数大法测出了一个数据
在这个例子中,走到第4个点时发现向右拐弯了,于是把第4个点抛出,这时第三个点还是向右拐弯的,所以应该一直抛出直到向左拐弯为止。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>using namespace std;
const double eps = 1e-8;
const int mx = 10005;
int n, top;
struct Point {int x, y;
}pt[mx], stack[mx];double dis(Point a, Point b) {return sqrt(1.0*(a.x-b.x)*(a.x-b.x) + 1.0*(a.y-b.y)*(a.y-b.y));
}int cross(int x1, int y1, int x2, int y2) {return x1*y2 - x2*y1;
}bool cmp(Point a, Point b) {int ans = cross(a.x-pt[1].x, a.y-pt[1].y, b.x-pt[1].x, b.y-pt[1].y);if (ans != 0) return ans > 0;else return dis(a, pt[1]) < dis(b, pt[1]);
}int solve() {top = 0;if (n < 3) return .0;stack[top++] = pt[1];stack[top++] = pt[2];stack[top++] = pt[3];Point a, b, c;for (int i = 4; i <= n; i++) {a = stack[top-2]; b = stack[top-1];int ans = cross(b.x-a.x, b.y-a.y, pt[i].x-a.x, pt[i].y-a.y);if (ans > 0) stack[top++] = pt[i];else {while (ans <= 0) {top--;a = stack[top-2]; b = stack[top-1];ans = cross(b.x-a.x, b.y-a.y, pt[i].x-a.x, pt[i].y-a.y);}stack[top++] = pt[i];}} int sum = 0;for (int i = 2; i < top; i++) {sum += cross(stack[i-1].x-stack[0].x, stack[i-1].y-stack[0].y, stack[i].x-stack[0].x, stack[i].y-stack[0].y);}return sum / 100;
}int main() {while (scanf("%d",&n) != EOF) {for (int i = 1; i <= n; i++) {scanf("%d%d", &pt[i].x, &pt[i].y);if (pt[i].y < pt[1].y || (pt[i].y == pt[1].y && pt[i].x < pt[1].x)) {swap(pt[i], pt[1]);}}sort(pt+2, pt+1+n, cmp); printf("%d\n",solve());}return 0;
}
poj3348(凸包模板题)相关推荐
- hdu4266(三维凸包模板题)
/*给出三维空间中的n个顶点,求解由这n个顶点构成的凸包表面的多边形个数.增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况:1> 在凸包内,则可以跳过2> 在凸包 ...
- 图论-有向图的连通性模板题(hdu1296)(hdu1827)
1.强连通分量: 强连通分量可以理解为边数最少的情况下是一个环. 这里写了一个模板题用的是tarjan算法,当然还有其他算法. tarjan算法的关键其实还是对于num数组和low数组的使用 然后可以 ...
- P1339 热浪 最短路径模板题
这么naive的题面一看就是最短路模板题~~~ ok.首先是floyd算法,tts,记得把k放在最外面就行了. 1 #include <cstdio> 2 #include <cst ...
- HDU2255 奔小康赚大钱(km模板题)
Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓, ...
- HDU1166 敌兵布阵(树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 数单词 (AC自动机模板题)
数单词 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...
- CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题
题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...
- hdu 2191 悼念512汶川大地震遇难同胞 【多重背包】(模板题)
题目链接:https://vjudge.net/problem/HDU-2191 悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 ...
- NYOJ 1085 数单词 (AC自动机模板题)
数单词 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...
最新文章
- Ubuntu 18 系统安装教程
- 原码,反码,补码,移码的概念以及各自的用途和优点
- 针对不同的Cookie做页面缓存
- 力挺2007年国内原创音乐届最权威大赛!
- java定义dll文件位置,生成网站时如何设置固定的dll文件名?-Java架构师必看
- SQL SERVER2000教程-第二章-创建和管理数据库 第六节 压缩数据库
- docker 使用中遇到的问题
- 轻松构建Tomcat源码
- [HAOI 2010]订货
- Percona Toolkit工具箱的安装与使用--完成复杂的mysql操作。
- HR_Hash Tables: Ransom Note
- java模拟安卓get请求,Java模拟HTTP Get Post请求实现论坛自动回帖功能
- android studio for android learning (二十 )android中this、context等关键概念理解全解
- “挖矿2.0”:资本方不是只能割区块链的韭菜
- 亚马逊买家号注册流程
- 转: 测试工具LoadRunner和OpenSTA比较分析
- c语言优秀教案,C语言优秀教案.doc
- 问题:如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?.md
- linux解决make依赖关系,makefile 自动处理头文件的依赖关系
- 读《逍遥游》感叹中国教育