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 ...
随机推荐
- rabbitmq使用报错总结
最近公司重构服务器架构,需要用到rabbitmq,在公司搞了一个下午还是连接不上,后来细看了英文说明,测试连接成功,得出如下报错几点. 我用的安装包:otp_win64_21.3.exe(erlang ...
- html 文档类型
<!doctype>用来声明html的版本,浏览器只有知道html的版本后才能正确显示文档,<!DOCTYPE>本身不是一个标签,而是一个声明.
- DTD举例二
DTD举例二: <!--hbase语句库约束文件--> <!DOCTYPE hbaseGroup [ <!ELEMENT hbaseGroup (statements*)> ...
- Flask-sqlacodegen
ORM操作有两种方式. 1.模型迁移到数据库中生成表,codefirst:使用flask-migrate: 需要flask-script: from flask_script import Manag ...
- BZOJ2002[Hnoi2010]弹飞绵羊——LCT
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
- day28 staticmethod 装饰器
静态方法装饰器 完全面向对象的程序中,如果存在某个函数既和对象无关也和类无关,就用staticmethod方法, 在调用此方法的时候只需要加上类名即可,说白了就是强行面向对象....把不是对象的方法也 ...
- IDEA常见设置
对于eclipse实在忍无可忍,各种功能各种bug..换回IDEA IDEA常见问题(其实不是问题,代码规范而已) 1.解决无限 This file is indented with tabs ins ...
- vimrc 的配置
windows syntax on set nocompatible set guifont=Consolas:h17 set linespace=0 color molokai set clipbo ...
- Twitter数据挖掘:如何使用Python分析大数据
我们可以创建变量来存放待拉取的微博数量(即count),以及待拉取的用户(即name).然后用这两个参数调用user_timeline()函数.下面是更新后的代码(注意,在代码的顶部应该保持认证和AP ...
- SQL Server解析XML数据的方法详解
--下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <Info Name=&q ...