[hdu 1348] Wall · 凸包
2015-12-20 17:04
302 查看
大概就是,给你n个点和一个值L,求这n个点的凸包,然后求与凸包相距l的外圈的周长。
结果=凸包的周长+半径的L的圆的周长
求凸包:
首先将n个按x坐标排序,然后选第一个点作为一个确定的点(最左边的点肯定在凸包上)
然后分两步,先求上凸包,再求下凸包。
求上凸包时,我们将目前已经在凸包里的点压入栈中,当做到第i号点的时候,如果发现
向量<top-1,i>在向量<top-1,top>的逆时针方向,那么说明top是凸包内的点而不是凸包上的点(现在求的是上凸包),所以将top从栈中弹出。
求下凸包的时候可以当成翻过来求上凸包,从后往前再扫一遍就行啦。
判断两个向量的相对方向可以用叉积,设有两个向量A(x1,y1),B(x2,y2),则A×B=x1y2-x2y1,
若B在A的逆时针方向,则A×B>0;
若B在A的顺时针方向,则A×B<0。
结果=凸包的周长+半径的L的圆的周长
求凸包:
首先将n个按x坐标排序,然后选第一个点作为一个确定的点(最左边的点肯定在凸包上)
然后分两步,先求上凸包,再求下凸包。
求上凸包时,我们将目前已经在凸包里的点压入栈中,当做到第i号点的时候,如果发现
向量<top-1,i>在向量<top-1,top>的逆时针方向,那么说明top是凸包内的点而不是凸包上的点(现在求的是上凸包),所以将top从栈中弹出。
求下凸包的时候可以当成翻过来求上凸包,从后往前再扫一遍就行啦。
判断两个向量的相对方向可以用叉积,设有两个向量A(x1,y1),B(x2,y2),则A×B=x1y2-x2y1,
若B在A的逆时针方向,则A×B>0;
若B在A的顺时针方向,则A×B<0。
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; #define pi 3.1415926535 #define sqr(x) ((x)*(x)) const int N=1005; struct arr{ int x,y; }a ; int stack ,top; int T,n,l; double ans; bool cmp(const arr A,const arr B){ return A.x<B.x || A.x==B.x && A.y<B.y; } double cha(int i,int j,int k){ int x1,x2,y1,y2; x1=a[j].x-a[i].x;y1=a[j].y-a[i].y; x2=a[k].x-a[i].x;y2=a[k].y-a[i].y; return x1*y2-x2*y1; } void CC(){ top=0; stack[++top]=1; //求上凸包 for (int i=2;i<=n;i++){ while (top>1 && cha(stack[top-1],stack[top],i)>=0) top--; stack[++top]=i; } int tmp=top; //求下凸包 for (int i=n-1;i>=1;i--){ while (top>tmp && cha(stack[top-1],stack[top],i)>=0) top--; stack[++top]=i; } ans=2*pi*l; for (int i=1;i<top;i++){ int p,q; p=stack[i];q=stack[i+1]; ans+=sqrt(sqr(a[p].x-a[q].x)+sqr(a[p].y-a[q].y)); } ans+=sqrt(sqr(a[stack[top]].x-a[1].x)+sqr(a[stack[top]].y-a[1].y)); } int main(){ scanf("%d",&T); while (T--){ scanf("%d%d",&n,&l); for (int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a+1,a+n+1,cmp); CC(); printf("%.0lf\n",ans); if (T) puts(""); //注意格式。。。。。囧 } return 0; }
相关文章推荐
- 测试
- leetcode (136) Single Number js代码实现
- 2015年终小记---------暗流涌动浪淘沙,千金难买一横眉
- leetcode: Search a 2D Matrix II
- Win7 Qt4.8.5+QtCreator2.8.0+mingw配置过程
- JS中的for和for in循环
- 使用HtmlUnit实现数据抓取
- ubuntu下安装sonarqube(团队代码评审工具)
- Emgu学习之(五)——图像模糊处理
- HTML5 地理位置定位API(2)
- win732位 + QT4.8.6 + QT CRETER 环境配置的搭建
- vmware虚拟机各个版本的安装破解(附安装包和注册机)
- 关系数据库中关系表间的连接(左连接,右连接,内连接,全连接,外连接)
- 使用slim3快速开发RESTful API
- Scala之Set、Map、TreeSet及TreeMap实例
- 不良函数接口一例
- 数据库--外键约束
- HTML5 地理位置定位API(1)
- Peter Thiel :人们高估了创业失败的收获
- Myisamchk使用