hdoj 4946 计算几何求凸包
2014-08-14 21:55
204 查看
首先这个题要好好审题,要想到速度一样的时候是求凸包。
速度不一样的时候,当然就是最大的那个是1了;
如果好几个点的速度都是一样且最大的。
那就需要对它们建立一个凸包,不过要先把重复的点去掉(比如标号为2,3 ,4的点是同一个点,那就需要只留下它们里面的一个标号就行,但要标记它,最后建立完凸包之后,在统计凸包上点的标号的时候,还要把它排除在外,因为它是重复的点,不可能比与它一样的点快)。另外速度为0的时候,也是输出0.
估计就是这个原因才那么多WA吧。代码不是关键,凸包都会写,就是要考虑好这些特殊情况。
代码如下:
速度不一样的时候,当然就是最大的那个是1了;
如果好几个点的速度都是一样且最大的。
那就需要对它们建立一个凸包,不过要先把重复的点去掉(比如标号为2,3 ,4的点是同一个点,那就需要只留下它们里面的一个标号就行,但要标记它,最后建立完凸包之后,在统计凸包上点的标号的时候,还要把它排除在外,因为它是重复的点,不可能比与它一样的点快)。另外速度为0的时候,也是输出0.
估计就是这个原因才那么多WA吧。代码不是关键,凸包都会写,就是要考虑好这些特殊情况。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define eps 1e-1 #define MAX 555 using namespace std; struct Point { int x,y; int v,id; Point(int x=0,int y=0):x(x),y(y) {} }; 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, int p) {return Vector(A.x*p,A.y*p);} Vector operator / (Vector A, int 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);} bool operator ==(const Point& a,const Point& b) { return a.x==b.x&&a.y==b.y; } int Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;} //点积 int Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x;} //叉积 //计算凸包,出入点数组p,个数为n,输出点数组ch,函数返回凸包顶点数。 //输入不能有重复点。函数执行完之后输入点的顺序被破坏 //如果不希望在凸包的边上有输入点,把两个<改成<= //在精度要求高的时候,用dcmp比较 bool cmp(Point a,Point b) { return a.v<b.v; } Point P[MAX],temp[MAX],ch[MAX]; int str[MAX],vis[MAX]; int ConvexHull(Point *p,int n,Point *ch) { sort(p,p+n); int m=0; for(int i=0;i<n;i++) { while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<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-2])<0) m--; ch[m++]=p[i]; } if(n>1) m--; return m; } int main() { int i,j; int n,casei=0; while(scanf("%d",&n),n) { memset(str,0,sizeof(str)); memset(vis,0,sizeof(vis)); casei++; for(i=0;i<n;i++) { scanf("%d%d%d",&P[i].x,&P[i].y,&P[i].v); P[i].id=i+1; } sort(P,P+n,cmp); j=0; temp[j++]=P[n-1]; for(i=n-2;i>=0;i--) { if(P[i].v==P[i+1].v) { temp[j++]=P[i]; } else break; } sort(temp,temp+j); temp[j].x=123456; temp[j].y=123456; int len=0,flag=0; for(i=0;i<j;i++) { temp[len++]=temp[i]; while(temp[i]==temp[i+1]) { flag=1; i++; } if(flag){ len--; vis[temp[i].id]=1; i--; flag=0; } } printf("Case #%d: ",casei); if(len==0||temp[0].v==0) { for(i=1;i<=n;i++) { printf("%d",str[i]); } printf("\n"); continue; } int k=ConvexHull(temp,len,ch); for(i=0;i<k;i++) { if(vis[ch[i].id]) str[ch[i].id]=0; else str[ch[i].id]=1; } for(i=1;i<=n;i++) { printf("%d",str[i]); } printf("\n"); } return 0; }
相关文章推荐
- 计算几何 凸包 hdoj2108 Shape of HDU
- hdu 4946 Area of Mushroom 计算几何(凸包)
- HDU 4946 - Area of Mushroom (计算几何 凸包)
- 【HDOJ5538】House Building(计算几何)
- pku 3348 计算几何 求凸包面积
- (HDU1348)计算几何--Scan法求凸包
- [计算几何] POJ 1873 暴力+凸包
- HDOJ题目1392Surround the Trees(数学几何,凸包模板)
- POJ1113(Wall) && Hdu1392(Surround the Trees) (计算几何--凸包)
- 【计算几何壮丽而荡漾】稍微谈谈凸包。
- HDU 3692 Shade of Hallelujah Mountain (计算几何,三维空间点的旋转,二维凸包)
- 计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)
- POJ 3528(计算几何+三维凸包表面积)
- I - Land Division Gym - 101243I 计算几何 切割凸包
- 计算几何-经典算法-凸包
- 1214: [视频]【计算几何】凸包
- 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival
- 计算几何基础——矢量和叉积 && 叉积、线段相交判断、凸包(转载)
- HDU 4946 Area of Mushroom (几何凸包)