题意:

现在有n个点,要求在n个点外面建栅栏,要求每个点到栅栏的距离都大于等于L,问需要的最短栅栏长度。

思路:

需要栅栏将n个点包围,第一反应可以想到凸包,然后再在凸包外面加栅栏。由于栅栏距离凸包的距离要大于L,因此我们思考如何加栅栏。

对于凸包的每个顶点,向连接顶点的两条线段建立垂线,长度为L,其余地方连成直线。可以发现最后就是凸包的总长度加上那几个小圆周的长度。然后我们来计算小圆周的度数。假设凸包一共有num个顶点,则凸包内角和为180*(num-2),图中可以发现 b = 180-a,共有num个顶点,将num个b加起来可以得到,180*num-num*a,num*a = 180*(num-2),因此ans = 360,所有小圆周的角度加起来为360度。因此ans = 凸包周长+半径为L的圆的周长。

最后的时候是%.0f输出,一开始下取整转成int一直WA...

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define pi acos(-1.0)
#define cross(p1,p2,p3) ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y)) //向量(p1,p2)与(p1,p3)叉乘
#define crossOp(p1,p2,p3) sign(cross(p1,p2,p3)) //判断正负,顺时针为负
using namespace std;//实数比较
typedef double db;
const db EPS = 1e-9;inline int sign(db a) {return a < -EPS ? -1 : a > EPS; } //返回-1表示a < 0, 1表示a > 0, 0表示a = 0inline int cmp(db a, db b) {return sign(a-b); } //返回-1表示a < b, 1表示a > b,0表示 a==b//点类
struct P {db x,y;P() {}P(db _x, db _y) : x(_x), y(_y) {}P operator+(P p) { return {x+p.x, y+p.y}; }P operator-(P p) { return {x-p.x, y-p.y}; }P operator*(db d) { return {x*d, y*d}; }P operator/(db d) { return {x/d, y/d}; }db dot(P p) { return x*p.x+y*p.y; }   //点积db det(P p) { return x*p.y-y*p.x; } //叉积P rot(db an) { return {x*cos(an)-y*sin(an),x*sin(an)+y*cos(an)}; } //旋转db abs() { return sqrt(abs2()); }db abs2() { return x*x+y*y; }db disTo(P p) { return (*this-p).abs(); }int quad() const { return sign(y) == 1 || (sign(y) == 0 && sign(x) >= 0); } //判断该点是否在x轴上方或x轴上bool operator<(P p) const {int c = cmp(x, p.x);if (c) return c == -1;    //先判断x大小return cmp(y, p.y) == -1; //再判断y大小}bool operator==(P p) const {return cmp(x, p.x) == 0 && cmp(y, p.y) == 0;}
};db area(vector<P> ps){  //多边形面积db ret = 0; rep(i,0,ps.size()-1) ret += ps[i].det(ps[(i+1)%ps.size()]);return ret/2;
}db perimeter(vector<P> ps){  //多边形周长db ret = 0; rep(i,0,ps.size()-1) ret += ps[i].disTo(ps[(i+1)%ps.size()]);return ret;
}vector<P> convexHull(vector<P> ps) {int n = ps.size(); if(n <= 1) return ps;sort(ps.begin(),ps.end());vector<P> qs(n*2); int k = 0;for(int i = 0; i < n; qs[k++] = ps[i++])while(k > 1 && crossOp(qs[k-2],qs[k-1],ps[i]) <= 0) --k;for(int i = n-2, t = k; i >= 0; qs[k++] = ps[i--])while(k > t && crossOp(qs[k-2],qs[k-1],ps[i]) <= 0) --k;qs.resize(k-1);return qs;
}int main()
{int n,L;while(~scanf("%d%d",&n,&L)){vector<P> ld;ld.clear();rep(i,1,n){db x,y;scanf("%lf%lf",&x,&y);P tp(x,y);ld.push_back(tp);}ld = convexHull(ld);db ans = perimeter(ld);ans += 2*pi*(double)L;printf("%.0f\n",ans);}return 0;
}

【POJ 1113】Wall【凸包+一点思维】相关推荐

  1. poj 1113 Wall 凸包的应用

    题目链接:poj 1113   单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: 1 #include<iostream& ...

  2. POJ 1113 Wall 求凸包

    http://poj.org/problem?id=1113 不多说...凸包网上解法很多,这个是用graham的极角排序,也就是算导上的那个解法 其实其他方法随便乱搞都行...我只是测一下模板... ...

  3. poj 1113/3348 凸包(若干点外建围墙)

    题意:通过坐标给定若干城堡,要在城堡外建立一个围墙,要求任意城堡到围墙的最小距离不少于一个整数r.求围墙的最小长度. 思路:答案为城堡的凸包长加上以r为半径的元周长.因为圆周的圆心角大小之和为n*18 ...

  4. wall poj 1113

    题目链接:http://poj.org/problem?id=1113 题意:一个国王要在自己的城堡周围建一堵围墙,要求围墙距城堡最短距离为L.问建这样一堵围墙的最短长度是多少. 题解思路:显然围墙建 ...

  5. POJ - Wall(凸包周长)

    题目链接:http://poj.org/problem?id=1113 Time Limit: 1000MS Memory Limit: 10000K Description Once upon a ...

  6. 凸包 poj 1113

    求一个多边形  拐弯的地方用圆弧补上 距离>=l 求他的周长 求一个凸包的周长  加2*pi*l #include<stdio.h> #include<string.h> ...

  7. 【POJ - 3494】Largest Submatrix of All 1’s(加一点思维后化成 单调栈)

    题干: Given a m-by-n (0,1)-matrix, of all its submatrices of all 1's which is the largest? By largest  ...

  8. POJ 1228 —— “稳定”凸包

    POJ 1228 Grandpa's Estate 这是个好题目,同时也是个不和谐的题目(不和谐原因是题目出的存在漏洞,数据弱,而且有些条件没给清楚,为了一个SB错误无限WA之后,终于AC) 题意就废 ...

  9. POJ 1584 计算几何 凸包

    链接: http://poj.org/problem?id=1584 题意: 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包. 再给定一个圆形(圆心坐标和半径),判断这个 ...

  10. poj 1873 枚举+凸包

    题意:给出一些树的位置,价值,长度,现要求先砍一些树制成一定长度的篱笆将剩余的树围起来,求要砍树的最小总价值. 因为树的个数最多为15个很容易想到用二进制数表示树的状态进行遍历. #include&l ...

最新文章

  1. 转载 想要在项目中引入其他项目的方法为
  2. 西南大学网络教育学院计算机基础,西南大学网络与继续教育学院课程考试计算机基础【1056】...
  3. boost::search_n相关的测试程序
  4. 画像分析(3-3)标签建模-模型管理-新建关系
  5. 为啥Underlay才是容器网络的最佳落地选择
  6. Golang——多种运算符及优先级
  7. 果断收藏!156页PPT全景展现全球区块链发展(附完整版下载手册)
  8. 行走在消失中的五种编程语言
  9. 正版Fiddler下载地址
  10. 北京内推 | 华为诺亚方舟实验室招聘计算机视觉研究实习生
  11. 什么是软件项目管理中的WBS?
  12. HFSS周期结构超表面结构单元仿真
  13. 论CTOR添加到11月BCH协议升级
  14. linux下内存分配原因导致的Load过高
  15. CentOS联网(图解超详细)
  16. WordPress安装教程(2022)|详细
  17. 人工智能站在风口 云计算指数大涨7.96%
  18. 全球与中国喷雾器市场深度研究分析报告
  19. 云计算的五个基本特征、三种服务模式、四种部署模型
  20. python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息

热门文章

  1. 关于Ext checkboxfiled 获取值为 on的解决办法
  2. 只会编程的程序员没有前途
  3. Mysql删除数据报外键约束解决方法
  4. Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议
  5. java模板引擎哪个好_浅谈Java模板引擎性能对比
  6. Spring和Mybatis整合-mapper开发
  7. http | 状态码
  8. python批量添加水印_手把手教你用Python批量给图片添加水印!知了干货分享!
  9. android 挖孔屏适配_娜迦丨不只满足Android 10版本的完美适配,更积极与鸿蒙系统超前对接...
  10. python逢7跳过_python学习笔记(七)break 和continue