hdoj 4946 计算几何求凸包

本文详细介绍了如何使用凸包算法解决特定问题,特别是当输入点的速度相同时如何构建凸包,并讨论了特殊情况的处理方法,例如去除重复点以及速度为零的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先这个题要好好审题,要想到速度一样的时候是求凸包。

速度不一样的时候,当然就是最大的那个是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;
}

 

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值