博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4946 Area of Mushroom 凸包
阅读量:6436 次
发布时间:2019-06-23

本文共 3267 字,大约阅读时间需要 10 分钟。

链接:

题意:有n个人。在位置(xi,yi),速度是vi,假设对于某个点一个人比全部其它的都能先到那个点,那这个点就被这个人承包了。输出有多少人承包的(鱼塘)面积是无穷大。

思路:找出速度最大值,仅仅有速度是这个最大值的人才有可能承包无穷大的面积(由于快速者早晚会追上低速者)。

每两个人相比,他们能承包的位置的界线是他们坐标的中垂线,能够证明的是,在组成凸包时,在凸包里的人。承包的面积一定是有限的。

所以在凸包上的人(包含边上)才可能承包无穷大的面积。

注意点在于由于题里要求严格小于其它人到达的时间才干承包,所以假设出现重点重速的两个人,那么两个人都是不能承包的,可是在计算凸包时它们须要计进来由于有可能由于他们的存在导致其它人承包不了。

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-10#define INF 0x7fffffff#define maxn 10005#define PI acos(-1.0)#define seed 31//131,1313typedef long long LL;typedef unsigned long long ULL;using namespace std;int x[505],y[505],v[505],vis[505];int cmp(double x){ if(fabs(x)
0) return 1; return -1;}inline double sqr(double x){ return x*x;}struct point//点{ double x,y; int pos; int o; point() {} point(double a,double b):x(a),y(b) {} void input() { scanf("%lf%lf",&x,&y); } friend point operator + (const point &a,const point &b) { return point(a.x+b.x,a.y+b.y); } friend point operator - (const point &a,const point &b) { return point(a.x-b.x,a.y-b.y); } friend bool operator == (const point &a,const point &b) { return cmp(a.x-b.x)==0 &&cmp(a.y-b.y)==0; } friend point operator * (const point &a,const double &b) { return point(a.x*b,a.y*b); } friend point operator * (const double &a,const point &b) { return point(a*b.x,a*b.y); } friend point operator / (const point &a,const double &b) { return point(a.x/b,a.y/b); } double norm() { return sqrt(sqr(x)+sqr(y)); }//到原点距离 void out () const { printf("%.2f %.2f",x,y); }} p[505];double det (const point &a,const point &b){ return a.x*b.y-a.y*b.x;}//叉积double dot (const point &a,const point &b){ return a.x*b.x+a.y*b.y;}//点乘double dist (const point &a,const point &b){ return (a-b).norm();}//距离point rotate_point(const point &p,double A){ double tx=p.x,ty=p.y; return point (tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A));}//旋转,A是弧度struct polygon_convex{ vector
P; polygon_convex(int size=0) { P.resize(size); }} p_c;bool comp_less(const point &a,const point &b){ return cmp(a.x-b.x)<0||cmp(a.x-b.x)==0&&cmp(a.y-b.y)<0;}polygon_convex convex_hull(vector
a){ polygon_convex res(2*a.size()+5); sort(a.begin(),a.end(),comp_less); a.erase(unique(a.begin(),a.end()),a.end()); int m=0; for(int i=0; i
1 && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<0) m--; res.P[m++]=a[i]; } int k=m; for(int i=int(a.size())-2; i>=0; i--) { while(m>k && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<0) m--; res.P[m++]=a[i]; } res.P.resize(m); if(a.size()>1) res.P.resize(m-1); return res;}bool cmp3(point a,point b){ return a.x
pp; pp.clear(); memset(vis,0,sizeof(vis)); if(T==0) break; int pos=-1; int max_v=0; for(int i=1; i<=T; i++) { scanf("%d%d%d",&x[i],&y[i],&v[i]); if(v[i]>max_v) max_v=v[i]; } int top=0; for(int i=1; i<=T; i++) { if(v[i]==max_v) { p[top].x=(double)x[i]; p[top].y=(double)y[i]; p[top].pos=i; p[top].o=0; top++; } } printf("Case #%d: ",tt); if(max_v==0) { for(int i=1; i<=T; i++) printf("0"); printf("\n"); continue; } sort(p,p+top,cmp3); for(int i=0; i
0&&(p[i].x)==(p[i-1].x)&&(p[i].y)==(p[i-1].y))) p[i].o=1; } pp.push_back(p[0]); for(int i=1; i

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
vim 学习方法
查看>>
php token验证范例
查看>>
WebSocket的C++服务器端实现
查看>>
java中两种添加监听器的策略
查看>>
脑洞成现实!AI系统可提前10s预测地震
查看>>
Page页面生命周期——微信小程序
查看>>
Node.js编写CLI的实践
查看>>
Javascript数组对象的方法和属性
查看>>
oracle数据库的启动和停止
查看>>
《LoadRunner没有告诉你的》之七——使用 LoadRunner 连续长时间执行测试,如何保证参数化的数据足够又不会重复?...
查看>>
python easy_install django 安装
查看>>
读《图解HTTP》总结--第六章
查看>>
毕业就能拿到上万薪资的程序员他们都做了啥?
查看>>
最小的k个数
查看>>
iOS技巧之获取本机通讯录中的内容,解析通讯录源代码
查看>>
程序员从零到月薪15K的转变,python200G资料分享
查看>>
DNS域名解析的知识了解
查看>>
部署社交网站
查看>>
CentOS下如何修改主机名
查看>>
“机器人商店”是什么?卖机器人的吗?
查看>>