题目链接:hdu 4946

题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是他的,问谁的地盘面积是无穷大的.

思路:由于空间是无限大的,所以仅仅要速度最大就有可能有无限的地盘,重合的点不能严格的比对方快,也不符合规定,然后求速度最大的点围城的凸包,凡是在凸包上的点且不重合的,地盘都是无穷大.

比赛的时候,不会凸包的,现找的模板,不了解性能,不知道计算凸包不能传重合的点进去结果WA出翔

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>#define INF 1e9
#define maxn 1000
#define EPS 1e-6#define N 1000
using namespace std;
struct point
{int x,y;  //横纵坐标 : x,ydouble len,theta;  //与參考点的距离 len 与參考点构成的向量与 (1,0)向量构成的夹角的余弦值 theta
}g[N]; //定义了一个全局变量,记录凸包中的点
/*--------按余弦值,从大到小高速排序--------*/
void qsort(int st,int en)
{int i=st,j=en;g[0]=g[i];while(i<j){while(i<j && g[0].theta>=g[j].theta) j--;if(i<j) { g[i]=g[j]; i++; }while(i<j && g[0].theta<=g[i].theta) i++;if(i<j) { g[j]=g[i]; j--; }}g[i]=g[0];if(st<i-1) qsort(st,i-1);if(i+1<en) qsort(i+1,en);
}/*-----------Graham 扫描法-------------*/
void graham(int *n)
{/*第一步,寻找y坐标最小,然后x坐标最小的点*/int p=1;for(int i=2;i<=*n;i++)if((g[i].y<g[p].y)||(g[i].y==g[p].y && g[i].x<g[p].x)) p=i;g[0]=g[p]; g[p]=g[1]; g[1]=g[0];/*找到该点,并把它存放在 g 中的第一个元素的位子上*//*第二步,计算全部的点距离參考点的距离(len) 还有夹角的余弦值 (theta)*/for(int i=2;i<=*n;i++){g[i].len=sqrt((g[i].x-g[1].x)*(g[i].x-g[1].x)+(g[i].y-g[1].y)*(g[i].y-g[1].y));g[i].theta=100*(g[i].x-g[1].x)/g[i].len;}qsort(2,*n);//先依据夹角的余弦值从大到小排序/*第三步,将全部theta值相等的点,仅仅保存len值最大的,存放在数组map中*/point map[N];int tot=0; p=1;while(p<=*n){int k=p;while(fabs(g[p].theta-g[p+1].theta)<=EPS){if(g[p+1].len>g[k].len) k=p+1;p++;}map[++tot]=g[k];p++;}/*第四步,对map中的元素扫描一遍,确定凸包的元素,放在数组g中*/*n=tot; tot=3; //先做了一个小小的处理,使得自己更好理解memset(g,0,sizeof(g));g[1]=map[1]; g[2]=map[2]; g[3]=map[3]; //先将前三个点入栈 g for(int i=4;i<=*n;i++)  //依次用map中的每一个点对g中的点进行一次推断,看是否是属于凸包{double chaji=(g[tot].x-g[tot-1].x)*(map[i].y-g[tot].y)-(map[i].x-g[tot].x)*(g[tot].y-g[tot-1].y);for(;chaji<=0 && tot>=1;) //假设旋转的方向不同,g[tot]这个点就不是,删除,并继续推断 g 中下一个点是不是{tot--;chaji=(g[tot].x-g[tot-1].x)*(map[i].y-g[tot].y)-(map[i].x-g[tot].x)*(g[tot].y-g[tot-1].y);}g[++tot]=map[i]; //将map[i]这个点入栈,至于是否是属于凸包中的点,等待以后的点来推断}*n=tot;//凸包处理完,总共同拥有tot个凸包上的点
}/*---------------------------------------------------------------------------------------------*/struct Node{int x,y,v,rank,bl;
}tmp;
int maxe;
vector<Node> stu;
int cas=0;
bool cmp(Node a,Node b)
{return a.rank<b.rank;
}
void init(int n)
{stu.clear();maxe=0;for(int i=0;i<n;i++){scanf("%d %d %d",&tmp.x,&tmp.y,&tmp.v);tmp.rank=i;tmp.bl=0;stu.push_back(tmp);maxe=max(tmp.v,maxe);}
}
bool check(int a,int b,int tt)
{int c;if(b==tt){c=1;}else {c=b+1;}double chaji=(g[c].x-g[b].x)*(stu[a].y-g[c].y)-(stu[a].x-g[c].x)*(g[c].y-g[b].y);if(chaji<=EPS) return 1;else return 0;
}int main()
{//freopen("data.in","r",stdin);int n;while (~scanf("%d",&n)){    if(n==0) break;printf("Case #%d: ",++cas);init(n);if(maxe==0){for(int i=0;i<n;i++){printf("0");}}else {for(int i=0;i<n;i++){if(stu[i].v==maxe){stu[i].bl=1;}}for(int i=0;i<n-1;i++){if(stu[i].bl==1)//错误写法: if(stu[i].v=maxe){for(int j=i+1;j<n;j++){if(stu[i].x==stu[j].x&&stu[i].y==stu[j].y&&stu[i].v==stu[j].v&&i!=j){stu[j].bl=0;stu[i].bl=-1;}}}}int tt=0;for(int i=0;i<n;i++){if(stu[i].v==maxe&&stu[i].bl!=0){  g[++tt].x=stu[i].x;g[tt].y=stu[i].y;}}//printf("%d\n",tt);if(tt>=3){graham(&tt);for(int i=0;i<n;i++){if(stu[i].bl==1){stu[i].bl=0;for(int j=1;j<=tt;j++){if((stu[i].x==g[j].x&&stu[i].y==g[j].y)||check(i,j,tt)){stu[i].bl=1;break;}}}}}sort(stu.begin(),stu.end(),cmp);for(int i=0;i<n;i++){if(stu[i].bl==-1)stu[i].bl=0;printf("%d",stu[i].bl);}}puts("");}return 0;
}

转载于:https://www.cnblogs.com/mfrbuaa/p/4197182.html

HDU 4946 Area of Mushroom 凸包 第八次多校相关推荐

  1. HDU 4946 Area of Mushroom 凸包

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题意:有n个人.在位置(xi,yi),速度是vi,假设对于某个点一个人比全部其它的都能先到那个点,那 ...

  2. hdu 4946 凸包注意重点

    http://acm.hdu.edu.cn/showproblem.php?pid=4946 给你n个点的坐标和速度,如果一个点能够到达无穷远处,且花费的时间是最少的,则此点输出1,否则输出0. 每个 ...

  3. hdu 1043 ,pku 1077 Eight ,八数码问题

    某位神牛曾说过,此题是涉及到人生完不完整的一道题.. Goodness大牛曾总结了 八数码的八重境界 : http://www.cnblogs.com/goodness/archive/2010/05 ...

  4. HDU 3934 Summer holiday(凸包内接最大三角形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3934 题意:给出n个点,从中找出三个点使得面积最大. 思路:旋转卡壳模板题:首先求凸包,在旋转求最大面 ...

  5. HDU 6617 Enveloping Convex(凸包+半平面交+二分)

    首先对于这m个点维护出一个凸包M,那么问题就变成了判断凸包P进行放大缩小能不能包含凸包M.(凸包P可以进行中心对称变换再进行放大缩小,见题意) 如何判断合适的相似比呢,我们可以用二分去放大缩小凸包P的 ...

  6. HDU 2202 最大三角形 (凸包)

    Description 老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大. Eddy对这道题目百思 ...

  7. HDU 2019 Multi-University Training Contest 1 杭电2019多校联合训练赛 第一场 1001 Blank (6578)

    HDU 2019 Multi-University Training Contest 1 杭电2019暑期多校集训第一场 1001 Blank (6578) Problem Description T ...

  8. HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场

    题目:传送门. 题意:平面上有n个点,问是否存在四个点 (A,B,C,D)(A<B,C<D,A≠CorB≠D)使得AB的横纵坐标差的绝对值的和等于CD的横纵坐标差的绝对值的和,n<1 ...

  9. Gemstones(牛客第八场多校)

    链接:https://ac.nowcoder.com/acm/contest/888/G 来源:牛客网 Gromah and LZR have entered the seventh level. T ...

最新文章

  1. 关于Icon,Image,ImageIcon的简单的对比参考
  2. 产品问答| 如何选择行业?行业经验会变成阻碍吗?
  3. Pytorch基础(一) —— tensorboard的应用
  4. postgresql 插入 时间戳_数据也玩躲猫猫?PostgreSQL中别人提交的数据,我为什么看不到?...
  5. PyTorch入门(二)从零开始搭建一个神经网络
  6. centos7.0 安装docker
  7. javascript/js计算器的基础制作
  8. 设置手动双面打印_双面打印文档,你会吗?学会这几招,自动双面打印问题轻松解决...
  9. Activiti 7 配置及相关流程一站式介绍(包含基础流程及网关应用)
  10. Unity之UnityWebRequest和使用
  11. 为什么计算机窗口在桌面不显示,电脑桌面无法显示怎么解决
  12. php不使用框架,导出Excel,这里有代码,全解
  13. 【MySQL学习】DQL语言的学习 Data Query Language
  14. 高保真扬声器系统的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. Qt中操作SQLite数据库
  16. Windows 系统磁盘克隆
  17. GSM与PHS空中接口有什么相同?
  18. 虚拟机架设传世服务器,大话西游2特色版虚拟机镜像一键服务端+启动教程+物品ID+GM设置方法+数据库工具等...
  19. 白帽,黑帽,灰帽,绿帽!一文了解黑客的所有信息
  20. typeScript 技术胖 笔记 下

热门文章

  1. pdns backend mysql_安装PowerDNS(与MySQL后端)和Poweradmin在Debian蚀刻
  2. 一将无能,累死三军!数据团队有“会说话”的好领导,有多重要?
  3. 关于自然排序Comparable 和 比较器排序Comparator
  4. python学习——正则表达式
  5. pcm输出还是源码输出_LOL手游:上单英雄怎么选?还是推荐玩“狗头”,有肉又有输出...
  6. python装饰器 @ time模块示例(七分钟读懂)
  7. python字符串format格式化三
  8. android app打开流程_app开发模式的应用
  9. python类加载_如何重新加载一个类在python shell?
  10. iis7mysql 链接不上_Win7 64位IIS7出现数据库链接出错的解决办法