首页 > 其他分享 >POJ1228(稳定凸包问题)

POJ1228(稳定凸包问题)

时间:2023-05-31 17:33:39浏览次数:47  
标签:稳定 return Point top 凸包 DIY POJ1228 include


题目:Grandpa's Estate


题意:输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定。所谓稳

定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点。


分析:容易知道,当一个凸包稳定时,凸包的每条边上都要有至少三个点,若只有两个点,则可以增加一个点,得到更大的凸

包。这样我们可以求出凸包,在求凸包时把共线的点也加进来,这样我们就判断是否有连续的三点共线即可,具体参见代码。

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>

using namespace std;

const int N = 40005;

typedef double DIY;

struct Point
{
    DIY x,y;
};

Point p[N];
Point stack[N];
Point MinA;

int top;

DIY dist(Point A,Point B)
{
    return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}

DIY cross(Point A,Point B,Point C)
{
    return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);
}

bool cmp(Point a,Point b)
{
    DIY k=cross(MinA,a,b);
    if(k>0) return 1;
    if(k<0) return 0;
    return dist(MinA,a)<dist(MinA,b);  //这里共线的点按距离从小到大排序
}

void Graham(int n)
{
    int i;
    for(i=1; i<n; i++)
        if(p[i].y<p[0].y||(p[i].y==p[0].y&&p[i].x<p[0].x))
            swap(p[i],p[0]);
    MinA=p[0];
    sort(p+1,p+n,cmp);
    stack[0]=p[0];
    stack[1]=p[1];
    top=1;
    for(i=2; i<n; i++)
    {
        //注意这里我们把共线的点也压入凸包里
        while(cross(stack[top-1],stack[top],p[i])<0&&top>=1) --top;
        stack[++top]=p[i];
    }
}

bool Judge()
{
    for(int i=1;i<top;i++)
    {
        //判断凸包的一条边上是否至少有3点
        if((cross(stack[i-1],stack[i+1],stack[i]))!=0&&(cross(stack[i],stack[i+2],stack[i+1]))!=0)
            return false;
    }
    return true;
}

int main()
{
    int t,n,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        if(n<6)
        {
            puts("NO");
            continue;
        }
        Graham(n);
        cout<<endl;
        for(i=0;i<n;i++)
          cout<<p[i].x<<" "<<p[i].y<<endl;
        cout<<endl;
        for(i=0;i<=top;i++)
          cout<<stack[i].x<<" "<<stack[i].y<<endl;
        if(Judge()) puts("YES");
        else        puts("NO");
    }
    return 0;
}

 

标签:稳定,return,Point,top,凸包,DIY,POJ1228,include
From: https://blog.51cto.com/u_16146153/6388677

相关文章

  • 凸包相关
    凸包二维凸包凸多边形是指所有内角大小都在\(\left[0,\pi\right]\)范围内的简单多边形。凸包就是指在平面内能包含所有给定点的最小凸多边形叫做凸包。可以以下面的例子来形象理解一下。下面是一堆木桩,农夫约翰想要围成一个围栏,需要保证所有的木桩都在围栏内,但是约翰想尽......
  • 转:Sql Server 高并发的情况下,如何利用锁保证数据的稳定性
    前言SQL的锁机制,是时刻贯彻在每一次的sql事务中的,为了理解更透彻,介绍锁之前,我们得先了解,锁是为了干什么!!一、数据库异常情况1.1、先来聊聊数据可能发生个异常状况脏读:读未提交,顾名思义,读到了不该读的东西,如:事务B读到了事务A回滚的数据,就是脏读不可重复读:读已提交,同个事务内......
  • .NET技术:构建高效稳定的企业级应用程序
    在当今数字化的时代,企业对于高效、稳定和可扩展的应用程序需求日益增长。作为一个资深的.NET开发人员,我深知.NET技术的强大之处以及它在企业级应用程序开发中的重要性。本篇博客将探讨.NET技术在构建高效稳定的企业级应用程序中的关键优势,并分享一些实用的开发技巧和最佳实践。一、......
  • 凹度(concavity)和凸包(convex hull)
    Maskconcavity:在语义分割问题中,mask凹度是指形状或物体的凹陷程度的术语。它的计算方法是从mask凸包(convexhull)的面积中减去mask的面积并除以后者。凸包是包含掩码的最小凸形。¹²mask凹度的范围可以从0到1,其中0表示mask是凸的,没有凹痕,1表示mask是完全凹的,没有突起......
  • 直播源码技术控制直播稳定之消息篇
     在日常生活中,我们上网看直播在各个直播间内通常能看到各种各样的消息,像是用户为主播打赏礼物,直播间聊天区,又或是用户点赞出现的符号信息等,这些消息在让直播间变得多姿多彩同时,也为直播平台运营商面临了一个问题:当消息类型同时发出且数量庞大时,直播间就很可能崩溃,那我们如何解决......
  • 直播源码技术控制直播稳定之消息篇
    在日常生活中,我们上网看直播在各个直播间内通常能看到各种各样的消息,像是用户为主播打赏礼物,直播间聊天区,又或是用户点赞出现的符号信息等,这些消息在让直播间变得多姿多彩同时,也为直播平台运营商面临了一个问题:当消息类型同时发出且数量庞大时,直播间就很可能崩溃,那我们如何解决这个......
  • 常用的标准LCD驱动芯片,性价比高,稳定性好,多种封装型号选择VK1056
    型号:VK1056BVK1056C品牌:永嘉微电/VINKA封装形式:SOP24SSOP24年份:最新年份VK1056B/C概述:VK1056B/C是56点、内存映象和多功能的LCD驱动,VK1056B的软件配置特性使它适用于多种LCD应用场合,包括LCD模块和显示系统,用于连接主控制器和VK1056B的管脚只有4条,VK1056B......
  • m基于MSER最大稳定极值区域和SVM的交通标志检测识别算法的matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:       2.算法涉及理论知识概要        在计算机视觉领域,最大稳定极值区域(MSER)(MaximallyStableExtremalRegions)是一种用于在图像中进行斑点检测的方法。这个方法由Matas等人提出,用于在两个不同视角的......
  • 《Typora+PicGo +Github + jsDelivr + TinyPNG打造稳定快速、高效免费图床》的体验
    《Typora+PicGo+Github+jsDelivr+TinyPNG打造稳定快速、高效免费图床》前言我目前已完成Typora+PicGo图床配置以及PicGo上传失败的解决办法。不过看了EvanXu的这个图床后,发现还可以改进。原先我用的typora+PicGo+Gitter打造图床,而EvanXu的方法是用GItHub做仓库,用jsDelivr做C......
  • 告诉你数据库的稳定性都在测试什么
    中国信通院给定的稳定性测试的思想如下:保障分布式数据库系统的稳定运行,就先要有测试其稳定性的工具和方法。混沌测试是一种新兴的对分布式系统的稳定性进行测试的技术。其主要思想是测试人员主动对系统引入故障,例如单个或多个节点的线程故障、网络故障、CPU高负载、内存占用满、硬......