hdu1348 练习凸包模板使用
来源:互联网 发布:网络漂亮的小女孩图片 编辑:程序博客网 时间:2024/05/16 05:47
题意
- 找凸包,建立一圈围墙,要求围墙上每个点,距离凸包上最近点大于等于l,问围墙的周长
思路
- 就是求个凸包,再加上以L为半径的圆周长,看题中图很清楚
- 貌似很多小坑点,为了节约时间的话,最好看一下discuss,基本都说清楚了~
实现
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const double eps = 1e-8;const double PI = acos(-1.0);int n,l;int sgn(double x){ if(fabs(x) < eps)return 0; if(x < 0)return -1; else return 1;}struct Point{ double x,y; Point(){} Point(double _x,double _y) { x = _x;y = _y; } Point operator -(const Point &b)const { return Point(x - b.x,y - b.y); } //叉积 double operator ^(const Point &b)const { return x*b.y - y*b.x; } //点积 double operator *(const Point &b)const { return x*b.x + y*b.y; }};//*两点间距离double dist(Point a,Point b){ return sqrt((a-b)*(a-b));} /** 求凸包,Graham算法* 点的编号0~n-1* 返回凸包结果Stack[0~top-1]为凸包的编号*/const int MAXN = 1010;Point list[MAXN];int Stack[MAXN],top;//相对于list[0]的极角排序bool _cmp(Point p1,Point p2){ double tmp = (p1-list[0])^(p2-list[0]); if(sgn(tmp) > 0) return true; else if(sgn(tmp) == 0 && sgn(dist(p1,list[0]) - dist(p2,list[0])) <= 0) return true; else return false;}void Graham(){ Point p0; int k = 0; p0 = list[0]; //找最下边的一个点 for(int i = 1;i < n;i++) { if( (p0.y > list[i].y) || (p0.y == list[i].y && p0.x > list[i].x) ) { p0 = list[i]; k = i; } } swap(list[k],list[0]); sort(list+1,list+n,_cmp); if(n == 1) { top = 1; Stack[0] = 0; return; } if(n == 2) { top = 2; Stack[0] = 0; Stack[1] = 1; return ; } Stack[0] = 0; Stack[1] = 1; top = 2; for(int i = 2;i < n;i++) { while(top > 1 && sgn((list[Stack[top-1]]-list[Stack[top-2]])^(list[i]-list[Stack[top-2]])) <= 0) top--; Stack[top++] = i; }} int main(){ int T; cin >> T; while (T--){ cin>>n>>l; for (int i=0;i<n;i++){ scanf("%lf%lf",&list[i].x,&list[i].y); } Graham(); double ans = l*PI*2; for (int i=0;i<top;i++){ ans += dist(list[Stack[i]],list[Stack[(i+1)%top]]); } if (T != 0) printf("%.0lf\n\n",ans); else printf("%.0lf\n",ans); } return 0;}
0 0
- hdu1348 练习凸包模板使用
- 凸包,模板---hdu1348
- hdu1348 Wall(凸包模板题)
- hdu1348 Wall 凸包
- HDU1348 Wall 凸包
- hdu1348 Wall(凸包)
- HDU1348 Wall 【简单凸包】
- hdu1348 凸包 用了kuangbin的模板.自己做的
- HDU1348-Walls(经典凸包)
- Wall(HDU1348,凸包周长)
- Hdu1348凸包graham——scan法
- HDU1348
- hdu1348 凸包 jatvis卷包裹法 (此方法时间复杂度O(n^2))
- 【计算几何初步-凸包-Graham扫描法-极角序】【HDU1348】 WALL
- poj1113/hdu1348(凸包。。。两个网站上的输入输出有点出入)
- 练习使用模板
- 练习使用类模板
- 练习使用C++函数模板
- 安卓原生垂直进度条剥离打包(VerticalSeekBar)
- assign vs weak
- 网上销售平台--数据库物理模型及数据库设计(三)
- Loadrunner11测试ajax接口
- POJ 2184 - Cow Exhibition
- hdu1348 练习凸包模板使用
- iOS tableView的分割线短一节
- GNU hello代码分析
- commons-lang包中我们常用的类
- 01 (maven+SSH)网上商城项目实战之项目简介
- oracle 11g 审计
- D3D11天空盒的实现
- http协议
- 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对