花了连天时间来弄toj 2317.Wall:http://acm.tju.edu.cn/toj/showp2317.html

这是一个赤裸裸的凸包,两天下来,收获不少,慢慢盘点一下。

关于题目本身的分析:

根据题意,用墙把城堡为起来,且周长最短,且墙于城堡至少间隔L。对于一个多边形(凸多边形,凹多边形),如果想要使把它所有点都包含在内的另外一个多边形周长最短,那么必定是该多边形的凸包。那么将凸包的各个边向外移动L的距离,各个边之间就会产生一定距离。如果用半径为L的圆弧连接各边,思考一下,得到这这个图形必然是边长在最短的符合条件的答案。所以,ans=凸包周长+2*PI*L。

对于整个题目而言,第一次作的时候在精度上吃亏了。其实根本就没有必要使用double,int完全足够了。因此在定义PT的时候直接定义为

struct PT

{

int x,y;

};

由于需要按照极角排序,同时还要处理极角相同的问题,那么cmp()应该这么写:

inline int crossP(PT a,PT b,PT c)// abXac cross product
{
    return (c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
}
int cmp(PT a,PT b)
{
    int re=crossP(pt[0],a,b);
    if(re==0)
        return dis2(a,pt[0])<dis2(b,pt[0]);
    return re>0;
}

怎么理解sort()里头的cmp()?

我的理解是这样,sort完毕的序列中有a1在a2的前面,那么cmp(a1,a2)始终为true。也不知道准确不准确,请大虾指点~

解决了以上一个小问题,那么这下,我们的Graham-Scan就好写了。

//Graham-Scan
//int graham(PT pt[],PT stk[],int n);
//pt[]是所有点;stk[]返回凸包上的点,逆时针;n是所有点的总数;
//返回凸包上点的个数。

int graham(PT pt[],PT stk[],int n)
{
    int t,tt=0;
    for(t=1;t<n;t++)
    {
        if(pt[t].y<pt[tt].y || (pt[t].y==pt[tt].y && pt[t].x<pt[tt].x))
            tt=t;
    }//find the lowest & leftest point
    swap(pt[0],pt[tt]);
    sort(pt+1,pt+n,cmp);
    for(t=0;t<=2;t++)
        stk[t]=pt[t];
    int ps=2;
    for(t=3;t<n;t++)
    {
        while(crossP(stk[ps-1],stk[ps],pt[t])<=0)
            ps--;
        stk[++ps]=pt[t];
    }
    return ps+1;
}

That's all.

转载于:https://www.cnblogs.com/dosxp/archive/2008/09/03/1283324.html

Graham-Scan小总结——toj2317 Wall相关推荐

  1. Graham Scan凸包算法

    获得凸包的算法可以算是计算几何中最基础的算法之一了.寻找凸包的算法有很多种,Graham Scan算法是一种十分简单高效的二维凸包算法,能够在O(nlogn)的时间内找到凸包. 首先介绍一下二维向量的 ...

  2. 凸包Graham Scan算法实现

    凸包Graham Scan算法实现 凸包算法实现点集合中搜索凸包顶点的功能,可以处理共线情况,可以输出共线点也可以不输出而只输出凸包顶点.经典的Graham Scan算法,点排序使用极角排序方式,并对 ...

  3. graham算法 java_凸包Graham Scan算法实现

    凸包算法实现点集合中搜索凸包顶点的功能,可以处理共线情况,可以输出共线点也可以不输出而只输出凸包顶点.经典的Graham Scan算法,点排序使用极角排序方式,并对共线情况做特殊处理.一般算法是将共线 ...

  4. Graham Scan算法

    预备知识:凸集:集合S中任意两点的连线都在集合S中,如果简单的理解,可以理解为凸边形 凸包:对于给定集合X,所有包含X的凸集的交集,简单的理解,就是包含X的最小凸集,或者就是最外圈的点连起来 极角排序 ...

  5. Python:实现graham scan葛立恒扫描法算法(附完整源码)

    Python:实现graham scan葛立恒扫描法算法 from __future__ import annotations from collections import deque from e ...

  6. 计算几何入门 1.6:凸包的构造——Graham Scan算法

    上文简要分析出了凸包构造问题算法的下界:O(nlogn),在此就引入一种下界意义上最优的算法:Graham Scan算法.这种算法可以保证在最坏情况下时间复杂度也不超过nlogn.我们先大致了解一下算 ...

  7. 计算几何--凸包之graham scan算法

    Graham scan算法主要步骤: 找出所有已知点的y值最小,如果相同,取x值最小的点,作为基准点s. 以s为基准,所有的点按照与X轴夹角从小到大排序. 使用两个栈,一个记录已访问的点,一个记录未访 ...

  8. Graham扫描法求解二维凸包问题

    最近在LeetCode的每日一题和实验中接连遇到凸包问题,因为之前从来没写过,于是写这篇博客记录一下,内容部分参考每日一题的官方题解和算法导论.算法的具体描述以及代码实现多为个人理解,如有谬误还请指出 ...

  9. HDU 1348 Wall ( 凸包周长 )

    链接:传送门 题意:给出二维坐标轴上 n 个点,这 n 个点构成了一个城堡,国王想建一堵墙,城墙与城堡之间的距离总不小于一个数 L ,求城墙的最小长度,答案四舍五入 思路:城墙与城堡直线长度是相等的, ...

  10. HDUOJ 1392凸包graham算法

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

最新文章

  1. php批量生成200条8位兑换码
  2. python不能加密_Python之加密模块
  3. javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
  4. 做算法题时的一些小技巧
  5. 【iCore1S 双核心板_ARM】例程十二:DMA实验——存储器到存储器的传输
  6. 【做题记录】[NOIP2016 普及组] 魔法阵
  7. dat文本导入mysql_mysql学习笔记(九) 增删改查的优化
  8. 数据源管理 | 主从库动态路由,AOP模式读写分离
  9. 记录C++ Builder 6.0开发过程中的一个linker error
  10. 树莓派4b自带wifi_树莓派4B日志二:WiFi远程配置与换源
  11. 代码生成工具之数据库表及字段名称转义
  12. python就业方向-看完Python这五大就业方向的薪资待遇,你选择哪个?
  13. 高中 信息科技 计算机网络 课件,初中信息技术课件第一课--认识计算机网络.ppt...
  14. Welcome to MySQL Workbench:MySQL 复制表
  15. spring5学习笔记
  16. Vue实现状态的不同颜色
  17. uniapp中如何使用微信SDK
  18. linux内存占用过高怎么解决,centos7内存占用过高处理方法
  19. 智能车浅谈——硬件篇
  20. PC历史上的20位英雄

热门文章

  1. 用python语言写一个简单的计算器
  2. React Component Lifecycle(生命周期)
  3. 移植SlidingMenu Android library,和安装example出现的问题解决
  4. ViewPager异常,对ViewPager源码分析
  5. ADO.NET:C#/SQL Server
  6. DESCRIBE TABLE
  7. 【c++】知识点积累
  8. linux 下socket通信,client断开service退出解决办法
  9. 算法:两条线段求交点
  10. leetcode container-with-most-water(medium) /java