HDU 4946 Area of Mushroom (几何凸包)
题意:给定n个人,每个人有一个速度v方向任意。如果平面中存在一个点只有某个人到达的时间最短(即没有人比这个人到的时间更短或相同),那么我们定义这个店归这个人管辖,现在问这些人中哪些人的管辖范围是无限的,无限的输出1,否则输出0。
题解:这道题错了好多遍TOT,首先我们从速度角度考虑,速度不是最大值的人管辖范围一定有限为0,所以我们只需要考虑速度最大值的人即可,如果速度最大值为0要特判一下。所以我们对于这些人先求一个凸包,再来研究这个凸包:
这个题有很多坑,首先在凸包边上的人也要考虑进去,但是要注意只考虑速度为最大值的人,因为他们的管辖范围也是无限的,先把凸包求出来再用叉积遍历速度最大值的人,注意在这个遍历过程要循环遍历即不能丢了0和num-1这条边。还有人也可能重合,有可能两个速度为最大值的人站在凸包的一个点上,但是算凸包之前不能直接删去因为会影响凸包,边上的也要考虑,所以要用flag=1标记一下他们最后再把他们的结果标为0。求凸包之前先标记一下每个点的标记为i,最后算结果的时候注意嵌套数组一定注意算的是id而不是i。还要注意所有点在一条线上的时候,凸包长度会*2,小心数组越界RE,所以把数组开大一点好。在求凸包过程中不能把<=改为<来求边上的人,这样是不对的。
不能从<=改为<的原因:
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
struct Point{
double x,y;
int id,v,flag;
Point(double x=,double y=,int id=-,int v=-,int flag=-):x(x),y(y),id(id),v(v),flag(flag){}
};
typedef Point Vector;
Vector operator + (Vector A,Vector B)
{
return Vector(A.x+B.x,A.y+B.y);
}
Vector operator - (Point A,Point B)
{
return Vector(A.x-B.x,A.y-B.y);
}
Vector operator * (Vector A,double p)
{
return Vector(A.x*p,A.y*p);
}
Vector operator / (Vector A,double p)
{
return Vector(A.x/p,A.y/p);
}
bool operator <(const Point &a,const Point &b)
{
return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
const double eps=1e-;
int dcmp(double x)
{
if(fabs(x)<eps) return ; else return x<?-:;
}
bool operator ==(const Point &a,const Point &b)
{
return dcmp(a.x-b.x)==&&dcmp(a.y-b.y)==;
}
double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
}
int ConvexHull(Point *p,int n,Point* ch)
{
sort(p,p+n);
int m=;
for(int i=;i<n;i++)
{
while(m>&&Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
ch[m++]=p[i];
}
int k=m;
for(int i=n-;i>=;i--)
{
while(m>k&&Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
ch[m++]=p[i];
}
if(n>) m--;
return m;
}
int main()
{
int n,m,cas=;
while(scanf("%d",&m)&&m)
{
Point p[],ch[];
int mx=-;
memset(p,,sizeof(p));
memset(ch,,sizeof(ch));
for(int i=;i<m;i++)
{
scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].v);
p[i].id=i;
p[i].flag=-;//flag
mx=max(mx,p[i].v);
}
//也可以sort排序做
for(int i=;i<m;i++)
for(int j=i+;j<m;j++)
if((p[i].x==p[j].x)&&(p[i].y==p[j].y)&&(p[i].v==p[j].v))
{
p[i].flag=;
p[j].flag=;
}
if(mx==)
{
printf("Case #%d: ",cas++);
for(int i=;i<m;i++)
printf("");
printf("\n");
continue;
}
int cnt=;
for(int i=;i<m;i++)
{
if(p[i].v==mx)
{
ch[cnt++]=p[i];
}
}
Point ans[];
memset(ans,,sizeof(ans));
int num=ConvexHull(ch,cnt,ans);
//cout<<num<<endl;
int num2=;
Point ans2[];
int a1[];
memset(a1,,sizeof(a1));
for(int i=;i<cnt;i++) //
for(int j=;j<num;j++) //
if(Cross(ans[j]-ans[(j+)%num],ans[j]-ch[i])==) //这里用j+1更好因为可以取余
{
//如果在凸包上或凸包边上而且不重复
//不必先把边上的点先求出来
if(p[ch[i].id].flag==-)
a1[ch[i].id]=;
}
printf("Case #%d: ",cas++);
for(int i=;i<m;i++)
printf("%d",a1[i]);
printf("\n");
}
return ;
}
/*
3
0 0 3
1 1 3
2 2 3
*/
HDU 4946 Area of Mushroom (几何凸包)的更多相关文章
- hdu 4946 Area of Mushroom(凸包)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 Area of Mushroom Time Limit: 2000/1000 MS (Java/Ot ...
- HDU 4946 Area of Mushroom 共线凸包
题意是在二维平面上 给定n个人 每一个人的坐标和移动速度v 若对于某个点,仅仅有 x 能最先到达(即没有人能比x先到这个点或者同一时候到这个点) 则这个点称作被x占有 若有人能占有无穷大的面积 则输出 ...
- hdu 4946 Area of Mushroom (凸包,去重点,水平排序,留共线点)
题意: 在二维平面上,给定n个人 每个人的坐标和移动速度v 若对于某个点,只有 x 能最先到达(即没有人能比x先到这个点或者同时到这个点) 则这个点称作被x占有,若有人能占有无穷大的面积 则输出1 , ...
- HDU 4946 Area of Mushroom 凸包 第八次多校
题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...
- HDU 4946 Area of Mushroom(构造凸包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...
- HDU 4946 Area of Mushroom 凸包
链接:pid=4946">http://acm.hdu.edu.cn/showproblem.php?pid=4946 题意:有n个人.在位置(xi,yi),速度是vi,假设对于某个点 ...
- HDU 4946 Area of Mushroom(2014 Multi-University Training Contest 8)
思路: 只有速度最大才有可能为1,速度不是最大肯定为0,那么就是 只需要操作那些速度最大的点,这些点求一个凸包,判断一下是不是在凸包边上即可. 有几个需要注意的地方: 1.最大速度如果为0 那么肯 ...
- [hdu-4946] Area of Mushroom 计算几何 凸包
大致题意: 平面上有n个人,给你每个人的坐标和一个速度v,如果某个人比其他所有人都先到达某点,则该点就被这个人掌控,求谁掌控者无限大的面积. 首先 速度最大的人,抛弃其他人,速度小的人必定无法得到无限 ...
- HDU 4946 凸包
给你n个点,具有速度,一个位置如果有其他点能够先到,则不能继续访问,求出里面这些点哪些点是能够无限移动的. 首先我们考虑到,一个速度小的和一个速度大的,速度小的必定只有固定他周围的一定区域是它先到的, ...
随机推荐
- codevs4096 删数问题
题目描述 Description 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N 和S,寻找一种方案使得剩下的数字组成的新数最小. 输入 ...
- Access应用笔记<三>
在搭了一个数据库后,买了一本<让excel飞>,里面有提及access 经过研究之后,发现access+excel的结合确实能解决我的大部分难题,并且可以做得更好. 比较好的方法是, ac ...
- .Net程序员必须要知道的东西之HttpModules与HttpHandlers介绍
一.ASP.NET对请求处理的过程: 当客户端请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI. ...
- 如何用SQL命令行工具删除dedecms指定id文章
用dedecms采集时标题字段设置错了,出现了注释符号<!---->,导致后台的文章列表出现错误,也无法直接从列表中删除,可以远程登录数据库去操作,这个相对比较麻烦,想着直接从后台的SQL ...
- mongoDB- - 2 增、删、改 操作
1.创建数据库 语法:use database 说明:如果database不存在,就会创建database:如果存在就会切换到database 2.查看所有数据库 语法:show dbs; 说明:如果 ...
- iOS开发——UI进阶篇(十)导航控制器、微博详情页、控制器的View的生命周期
一.导航控制器出栈 1.initWithRootViewController本质 UIViewController *vc = [[OneViewController alloc] init]; // ...
- cocos2d事件处理机制之我见
cocos2d是使用pyglet事件框架来处理事件的. 其中,包括分发器(发射器)和监听器两部分.下面形象的来打个比方. 这个机制就好比一把枪,三步:扣扳机(触发),上弹(注册),给子弹上***(这个 ...
- web文件操作常见安全漏洞(目录、文件名检测漏洞)
做web开发,我们经常会做代码走查,很多时候,我们都会抽查一些核心功能,或者常会出现漏洞的逻辑.随着技术团队的壮大,组员技术日益成熟. 常见傻瓜型SQL注入漏洞.以及XSS漏洞.会越来越少,但是我们也 ...
- [BZOJ1662][POJ3252]Round Numbers
[POJ3252]Round Numbers 试题描述 The cows, as you know, have no fingers or thumbs and thus are unable to ...
- 跟着百度学PHP[4]OOP面对对象编程-10-静态关键字static
使用static关键字可以将类中的成员标识为静态的,既可以用来标识成员属性,也可以用来标识成员方法. 以Person类为例,如果在person类中有一个“$country=’china’”的成员属性, ...