UVA 10652 Board Wrapping(凸包求面积 刘汝佳训练指南模板)
来源:互联网 发布:量化投资程序员招聘 编辑:程序博客网 时间:2024/05/22 04:24
题目链接:https://vjudge.net/problem/UVA-10652
题意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们包起来,并计算木板占整个包装面积的百分比.
思路;
给出了每个木板的中心和长,宽以及旋转角度,通过先旋转向量然后把中心点平移对应的向量可以求出矩形的4个顶点坐标.
然后我们根据矩形的所有顶点求出凸包,并求出凸包的面积.(即总面积)
最后用所有矩形的面积和/总面积就是百分比了.
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const double eps=1e-10;const double PI=acos(-1);int dcmp(double x){ if(fabs(x)<eps) return 0; return x<0?-1:1;}struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} bool operator<(const Point &B)const { return dcmp(x-B.x)<0 || (dcmp(x-B.x)==0 && dcmp(y-B.y)<0 ); } bool operator==(const Point &B)const { return dcmp(x-B.x)==0 && dcmp(y-B.y)==0; }};typedef Point Vector;Vector operator-(Point A,Point B){ return Vector(A.x-B.x,A.y-B.y);}Vector operator+(Vector A,Vector B){ return Vector(A.x+B.x,A.y+B.y);}double Cross(Vector A,Vector B)//向量差积{ return A.x*B.y-A.y*B.x;}Vector Rotate(Vector A,double rad){ return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));}double PolygonArea(Point *p,int n)//计算凸包的面积{ double area=0; for(int i=1;i<n-1;++i) area += Cross(p[i]-p[0],p[i+1]-p[0]); return fabs(area)/2;}int ConvexHull(Point *p,int n,Point *ch)//求凸包{ sort(p,p+n); n=unique(p,p+n)-p;//去重 int m=0; for(int i=0;i<n;++i) { while(m>1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-1])<=0 ) --m; ch[m++]=p[i]; } int k=m; for(int i=n-2;i>=0;i--) { while(m>k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-1])<=0) --m; ch[m++]=p[i]; } if(n>1) m--; return m;}const int maxn=600*4+10;Point p[maxn];int cnt;//点数目int main(){ int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); cnt=0; //当前点数目 double area1=0;//矩形面积和 while(n--) { double x,y,w,h,j; scanf("%lf%lf%lf%lf%lf",&x,&y,&w,&h,&j); area1 += w*h; Point o(x,y); //矩形中心点 double rad=-(j/180*PI); //角度转弧度 p[cnt++]=o+Rotate(Vector(w/2,h/2), rad);//p存储所有的点 p[cnt++]=o+Rotate(Vector(-w/2,h/2), rad); p[cnt++]=o+Rotate(Vector(w/2,-h/2), rad); p[cnt++]=o+Rotate(Vector(-w/2,-h/2), rad); } Point q[maxn];//q最后用来存储凸包点 cnt=ConvexHull(p,cnt,q); double area2=PolygonArea(q,cnt);//凸包总面积 printf("%.1lf %%\n",area1*100/area2); } return 0;}
阅读全文
0 0
- UVA 10652 Board Wrapping(凸包求面积 刘汝佳训练指南模板)
- UVA 10652 Board Wrapping(凸包求面积)
- UVa 10652 Board Wrapping(凸包面积)
- UVA 10652 Board Wrapping (凸包面积)
- UVA 10652 Board Wrapping 凸包模板
- UVA 10652 Board Wrapping
- UVA 10652 Board Wrapping
- uva 10652 Board Wrapping
- UVA 10652 Board Wrapping
- Uva - 10652 - Board Wrapping
- uva 10652Board Wrapping
- UVa 10652 Board Wrapping
- UVA 10652 Board Wrapping .
- UVA 10652 Board Wrapping
- UVa 10652 Board Wrapping 凸包
- UVA 10652 - Board Wrapping(求凸包)
- UVA 10652 Board Wrapping 计算几何
- UVA 10652 || Board Wrapping(向量旋转
- JS截取字符串常用方法详细整理
- JDBC学习笔记
- CentOS之——Bringing up interface eth0: Error: Connection activation failed:
- 用源代码构建jmeter二进制包
- 文章标题
- UVA 10652 Board Wrapping(凸包求面积 刘汝佳训练指南模板)
- Android APP 签名和上传到市场
- @Transactional 事务回滚 分析
- iOS第三方库汇总
- equals与==的区别。
- 读代码分析结果
- 【笔试】37互娱 补全程序使Java断言成立
- 捕鱼小游戏
- 通过脚本生成oracle的ODBC连接