POJ1113 Wall【凸包】
题意:
求把城堡围起来需要的最小墙壁周长。
思路:
围墙周长为=n条平行于凸包的线段+n条圆弧的长度=凸包周长+围墙离城堡距离L为半径的圆周长。
代码:
。。。还是看大佬写的,自己做个记录方便日后复习。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N=2e5+;
const double PI=acos(-1.0);
struct point{
int x,y;
}p[N];
int n;
int stack[N],top; int cross(point p0,point p1,point p2)//p0p1 * p0p2叉积 判断顺/逆时针
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
} double dis(point p1,point p2)
{
return sqrt((double)(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
} bool cmp(point p1,point p2)//极角排序 p[0]为最下方&&最左边的点
{
int tmp=cross(p[],p1,p2);
if(tmp>) return true;
else if(tmp==&&dis(p[],p1)<dis(p[],p2)) return true;//角度相同,距离小在前
else return false;
} void Graham(int n)//求凸包
{
if(n==){top=;stack[]=;}
if(n==)
{
top=;
stack[]=;
stack[]=;
}
if(n>)
{
for(int i=;i<=;i++) stack[i]=i;
top=;
for(int i=;i<n;i++)//O(2n) 求出前i个点集形成的凸包
{
//可以根据归纳法来证明,栈顶~0为前i-1个点集的凸包的顶点
//因为按极角排序后,若叉积<=0 则栈顶在(p[0],p[i],次栈顶)构成的三角形内部,栈顶不为前i个点集形成的凸包的极点.
while(top>&&cross(p[stack[top-]],p[stack[top]],p[i])<=)
top--;
top++;
stack[top]=i;
}
}
} int main()
{
double L;
while(cin>>n>>L)
{
int low=;
for(int i=;i<n;i++)
{
cin>>p[i].x>>p[i].y;
if((p[low].y==p[i].y&&p[low].x>p[i].x)||p[low].y>p[i].y)
low=i;
}
swap(p[],p[low]);//p[0]为最下方&&最左边的点
sort(p+,p+n,cmp);
Graham(n);
double res=;
for(int i=;i<top;i++)
res+=dis(p[stack[i]],p[stack[i+]]);
res+=dis(p[stack[]],p[stack[top]]);
res+=*PI*L;
printf("%d\n",int(res+0.5));//四设五入
}
return ;
}
POJ1113 Wall【凸包】的更多相关文章
- POJ1113 Wall —— 凸包
题目链接:https://vjudge.net/problem/POJ-1113 Wall Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- POJ1113:Wall (凸包算法学习)
题意: 给你一个由n个点构成的多边形城堡(看成二维),按顺序给你n个点,相邻两个点相连. 让你围着这个多边形城堡建一个围墙,城堡任意一点到围墙的距离要求大于等于L,让你求这个围墙的最小周长(看成二维平 ...
- POJ1113:Wall (凸包:求最小的多边形,到所有点的距离大于大于L)
Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the ...
- POJ1113 Wall 凸包
题目大意:建立围墙将城堡围起来,要求围墙至少距离城堡L,拐角处用圆弧取代,求围墙的长度. 题目思路:围墙长度=凸包周长+(2*PI*L),另外不知道为什么C++poj会RE,G++就没问题. #inc ...
- POJ1113 Wall
题目来源:http://poj.org/problem?id=1113题目大意: 如图所示,给定N个顶点构成的一个多边形和一个距离值L.建立一个围墙,把这个多边形完全包含在内,且围墙距离多边形任一点的 ...
- [poj1113][Wall] (水平序+graham算法 求凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- POJ-1113 Wall 计算几何 求凸包
题目链接:https://cn.vjudge.net/problem/POJ-1113 题意 给一些点,求一个能够包围所有点且每个点到边界的距离不下于L的周长最小图形的周长 思路 求得凸包的周长,再加 ...
- POJ 1113 - Wall 凸包
此题为凸包问题模板题,题目中所给点均为整点,考虑到数据范围问题求norm()时先转换成double了,把norm()那句改成<vector>压栈即可求得凸包. 初次提交被坑得很惨,在GDB ...
- hdu 1348 Wall (凸包)
Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- Hbase Shell 数据操作说明
启动.关闭hbase./bin/start-hbase.sh./bin/stop-hbase.sh 查询HBase版本.它的语法如下:hbase(main):010:0> version 建表c ...
- codeforces624A
Save Luke CodeForces - 624A Luke Skywalker got locked up in a rubbish shredder between two presses. ...
- python 模块之-logging
python 模块logging import logging ### 简单使用格式 日志级别等级CRITICAL > ERROR > WARNING > INFO > ...
- Django-website 程序案例系列-1 最简单的web服务器
templates:html模板文件夹下面建立文件login.html <!DOCTYPE html> <html lang="en"> <head& ...
- BZOJ4385[POI2015]Wilcze doły——单调队列+双指针
题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入 第一行包含三个整数n,p ...
- Python的二叉树实现
二叉树需要实现的功能及思路 找到最小值 没什么好说的就是二叉树最左下的顶点 找到最大值 没什么好说的就是二叉树最右下的顶点 插入 分情况,如果二叉树为空那么直接直接设置成根节点就好了.否则就逐层向下, ...
- 【BZOJ3309】DZY Loves Math(莫比乌斯反演)
[BZOJ3309]DZY Loves Math(莫比乌斯反演) 题面 求 \[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))\] 其中,\(f(x)\)表示\(x\)分解质因 ...
- 【BZOJ1816】[CQOI2010]扑克牌(二分,贪心)
[BZOJ1816][CQOI2010]扑克牌(二分,贪心) 题面 BZOJ 题解 看了一眼这题,怎么这么眼熟?woc,原来\(xzy\)的题目是搬的这道啊... 行,反正我考的时候也切了,这数据范围 ...
- pyEcharts
例子: from pyecharts import Line line = Line("我的第一个图表", "这里是副标题",width="800px ...
- python assert用法
使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...