POJ 1113 Wall 凸包 裸
题意:给出一个简单几何,问与其边距离长为L的几何图形的周长。
思路:求一个几何图形的最小外接几何,就是求凸包,距离为L相当于再多增加上一个圆的周长(因为只有四个角)。看了黑书使用graham算法极角序求凸包会有点小问题,最好用水平序比较好。或者用Melkman算法
- /** @Date : 2017-07-13 14:17:05
- * @FileName: POJ 1113 极角序求凸包 基础凸包.cpp
- * @Platform: Windows
- * @Author : Lweleth (SoungEarlf@gmail.com)
- * @Link : https://github.com/
- * @Version : $Id$
- */
- #include <stdio.h>
- #include <iostream>
- #include <string.h>
- #include <algorithm>
- #include <utility>
- #include <vector>
- #include <map>
- #include <set>
- #include <string>
- #include <stack>
- #include <queue>
- #include <math.h>
- //#include <bits/stdc++.h>
- #define LL long long
- #define PII pair<int ,int>
- #define MP(x, y) make_pair((x),(y))
- #define fi first
- #define se second
- #define PB(x) push_back((x))
- #define MMG(x) memset((x), -1,sizeof(x))
- #define MMF(x) memset((x),0,sizeof(x))
- #define MMI(x) memset((x), INF, sizeof(x))
- using namespace std;
- const int INF = 0x3f3f3f3f;
- const int N = 1e5+20;
- const double eps = 1e-8;
- const double Pi = acos(-1.0);
- struct point
- {
- int x, y;
- point(){}
- point(int _x, int _y){x = _x, y = _y;}
- point operator -(const point &b) const
- {
- return point(x - b.x, y - b.y);
- }
- int operator *(const point &b) const
- {
- return x * b.x + y * b.y;
- }
- int operator ^(const point &b) const
- {
- return x * b.y - y * b.x;
- }
- };
- double xmult(point p1, point p2, point p0)
- {
- return (p1 - p0) ^ (p2 - p0);
- }
- double distc(point a, point b)
- {
- return sqrt((double)((b - a) * (b - a)));
- }
- int n, l;
- point p[N];
- stack<int>s;
- int cmp(point a, point b)//以p[0]基准 极角序排序
- {
- int t = xmult(a, b, p[0]);
- if(t > 0)
- return 1;
- if(t == 0)
- return distc(a, p[0]) < distc(b, p[0]);
- if(t < 0)
- return 0;
- }
- void graham()
- {
- while(!s.empty())
- s.pop();
- for(int i = 0; i < min(n, 2); i++)
- s.push(i);
- int t = 1;
- for(int i = 2; i < n; i++)
- {
- while(s.size() > 1)
- {
- int p2 = s.top();
- s.pop();
- int p1 = s.top();
- if(xmult(p[p1], p[p2], p[i]) > 0)
- {
- s.push(p2);
- break;
- }
- }
- s.push(i);
- }
- }
- int main()
- {
- while(~scanf("%d%d", &n, &l))
- {
- int x, y;
- int mix, miy;
- mix = miy = INF;
- int pos = -1;
- for(int i = 0; i < n; i++)
- {
- scanf("%d%d", &x, &y);
- p[i] = point(x, y);
- if(miy > y || miy == y && mix > x)//注意选第一个点 是最左下方的
- {
- mix = x, miy = y;
- pos = i;
- }
- }
- swap(p[pos], p[0]);
- sort(p + 1, p + n, cmp);
- graham();
- double ans = l * Pi * 2.0000;
- int t = 0;
- while(!s.empty())
- {
- ans += distc(p[t], p[s.top()]);
- t = s.top();
- s.pop();
- }
- printf("%d\n", (int)(ans + 0.500000));
- }
- return 0;
- }
POJ 1113 Wall 凸包 裸的更多相关文章
- poj 1113 wall(凸包裸题)(记住求线段距离的时候是点积,点积是cos)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43274 Accepted: 14716 Descriptio ...
- poj 1113 Wall 凸包的应用
题目链接:poj 1113 单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: #include<iostream> ...
- POJ 1113 Wall 凸包求周长
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26286 Accepted: 8760 Description ...
- POJ 1113 - Wall 凸包
此题为凸包问题模板题,题目中所给点均为整点,考虑到数据范围问题求norm()时先转换成double了,把norm()那句改成<vector>压栈即可求得凸包. 初次提交被坑得很惨,在GDB ...
- POJ 1113 Wall【凸包周长】
题目: http://poj.org/problem?id=1113 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- poj 1113:Wall(计算几何,求凸包周长)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28462 Accepted: 9498 Description ...
- 2018.07.04 POJ 1113 Wall(凸包)
Wall Time Limit: 1000MS Memory Limit: 10000K Description Once upon a time there was a greedy King wh ...
- POJ 1113 Wall(凸包)
[题目链接] http://poj.org/problem?id=1113 [题目大意] 给出一个城堡,要求求出距城堡距离大于L的地方建围墙将城堡围起来求所要围墙的长度 [题解] 画图易得答案为凸包的 ...
- POJ 1113 Wall 求凸包
http://poj.org/problem?id=1113 不多说...凸包网上解法很多,这个是用graham的极角排序,也就是算导上的那个解法 其实其他方法随便乱搞都行...我只是测一下模板... ...
随机推荐
- 软件工程-东北师大站-第六次作业PSP
1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图
- 《Linux内核与分析》第六周
20135130王川东 1.操作系统的三大管理功能包括:进程管理,内存管理,文件系统. 2. Linux内核通过唯一的进程标识PID来区别每个进程.为了管理进程,内核必须对每个进程进行清晰的描述,进程 ...
- 如何在一台 web 服务器上注册CA证书
试验环境介绍(CA的主机为192.168.23.10.httpd的主机为:192.168.23.11) 1:新建一台web服务器,主机名为www yum install -y httpd 2:生成 ...
- 软工网络15团队作业4-DAY7
每日例会 昨天的工作. 张陈东芳:sql连接的基本完成,尝试被其他类调用,未导入全部商品信息: 吴敏烽:基本完成商品信息的调用: 周汉麟:设定商品的调用规则: 林振斌:设计缓存区代码,用于存取最近浏览 ...
- 【第五周】alpha发布之小组评论
对于昨天的阿尔法发布,有那么几点需要说一下: 1,对这次阿尔法发布的过程,我们组还是基本顺利的,由于之前吃过亏,这次我提前试用了一下投影仪,做了些调试,之后的发布过程起码设备上是正常的. 2,我们的项 ...
- jsp和js中获取项目路径名
一.jspa.<%=request.getContextPath()%>//结果:/projectNameb.${pageContext.request.contextPath}//结果: ...
- C++解析(30):关于指针判别、构造异常和模板二义性的疑问
0.目录 1.指针的判别 2.构造中的异常 2.1 如果构造函数中抛出异常会发生什么? 2.2 如果析构函数中抛出异常会发生什么? 3.令人迷惑的写法 3.1 模板中的二义性 3.2 函数异常声明 4 ...
- [CodeVs1515]跳(lucas定理+费马小定理)
嘿嘿嘿好久没写数学题了,偶尔看到一道写一写... 题目大意:一个(n+1)*(m+1)[0<=n, m<=10^12,n*m<=10^12]的矩阵,C(0,0)=1,C(x,y)=C ...
- JSP2 的自定义标签
在 JSP 中开发标签库只需如下几个步骤 1.开发自定义标签处理类 2.建立一个 *.tld 文件,每个 *.tld 文件对应一个标签库,每个标签库可包含多个标签 3.在 JSP 文件中使用自定义标签 ...
- php求一维数组的排列
<?php class CombinationsGenerator { public function generate(array $list) { if (count($list) > ...