您的位置:首页 > 其它

hdoj 4946 计算几何求凸包

2014-08-14 21:55 204 查看
首先这个题要好好审题,要想到速度一样的时候是求凸包。

速度不一样的时候,当然就是最大的那个是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: