计蒜客 羊圈(凸包+多边形面积计算模板)
来源:互联网 发布:下什么软件淘宝返钱 编辑:程序博客网 时间:2024/05/22 14:03
题目链接:https://www.jisuanke.com/course/615/28220
题目大意:让你求解出可以用木棍围出的最大面积,然后算出可以容纳多少只羊
题目思路:首先用扫描线法求出凸包的点集,然后再利用叉积求出多边形的面积。
学到的东西:利用叉积求面积可能是负数,这样就用到了abs()函数。这个题目要求羊的个数,有小数点怎么办?向下取整!!!floor()floor()floor()!!!这个地方错到吐血。
代码:
#include <bits/stdc++.h>using namespace std;const int N=10001;const double eps=1e-10;struct node{ double x,y;}point[N],ch[N];int n,len;double multi(node a,node b,node c) //a在cb左边则小于0 ,a在cb的右边则大于0{ return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);}double dis(node a,node b) //距离相同去最短{ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}void graham_scan(node point[N],node ch[N],int n){ int i,j,k,top; struct node t; k=0; //找到最下且偏左的那个点 for(i=1;i<n;i++) if(point[i].y<point[k].y||(point[i].y==point[k].y&&(point[i].x<point[k].x))) k=i; t=point[0];//将这个点指定为point[0]; point[0]=point[k]; point[k]=t; //按极角从小到大,距离偏短进行排序 for(i=1;i<n-1;i++) { k=i;//选择排序,每次至少找到一个极角最小的点 for(j=i+1;j<n;j++) if(multi(point[j],point[k],point[0])>0||(fabs(multi(point[j],point[k],point[0]))<=eps&& //multi为toleft检测,如果大于0说明被测的在右边极角小 (dis(point[0],point[j])<dis(point[0],point[k])))) k=j; //k保存极角最小的那个点,或者相同距离原点最近 t=point[i]; point[i]=point[k]; point[k]=t; } //第三个点先入栈 ch[0]=point[0]; ch[1]=point[1]; ch[2]=point[2]; top=2; //判断与其余所有点的关系 for(i=3;i<n;i++) { //不满足向左转的关系,栈顶元素出栈 while(multi(point[i],ch[top],ch[top-1])>0||fabs(multi(point[i],ch[top],ch[top-1]))<=eps) top--; //当前点与栈内所有点满足向左关系,因此入栈 ch[++top]=point[i]; } len=top+1;}double cross(node a,node b,node o){ return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);}double area(int n){ double res=0.0; for(int i=0;i<n-1;i++) res+=cross(ch[i],ch[i+1],ch[0]); return res/2.0;}int main(){ int i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%lf%lf",&point[i].x,&point[i].y); graham_scan(point,ch,n); int ans=floor(abs(area(len))/50); printf("%d\n",ans); return 0;}
阅读全文
1 0
- 计蒜客 羊圈(凸包+多边形面积计算模板)
- 计蒜客 羊圈复原 (凸包模板)
- 计算几何-计算多边形面积(模板)
- 二维计算几何模板--多边形/凸包
- hdu2306(模板可用于计算仍以多边形面积)
- POJ 3348(计算几何+二维凸包+多边形面积)
- 计算多边形面积(JAVA)
- 凸包 及 多边形面积
- BSOJ1478:多边形面积 凸包
- 【Algorithm】 多边形+凸包+面积
- HDU1616计算几何-凸包+点在多边形内+多边形的面积
- 计蒜客 多边形面积(pick定理模板题)
- 凸包面积模板
- POJ 3348 Cows (凸包+多边形面积)
- 凸包,多边形面积(包装木板,uva 10652)
- 求多边形的面积(模板)
- HDU2036 多边形面积模板
- 任意多边形面积模板
- css超简单实现div页面居中【适合做弹出框】
- MySQL添加用户、删除用户与授权
- MySQL debug设置
- selenium+java破解极验滑动验证码
- constructor和prototype的总结
- 计蒜客 羊圈(凸包+多边形面积计算模板)
- 理解 Unity 的 Transform
- Git-balabala
- 遍历目录,把文件内容导入数据库
- 数据库日期转换为时间戳
- javascript实战演练笔记
- SQL语言共分为四大类
- mac常用的快捷操作
- [leetcode]115. Distinct Subsequences