护城河的挖掘「USACO 2006」

题意

凸包模板,给定平面上点集,求包含所有点的凸包周长最小值。


思路

使用\(Graham\)扫描法解决。

考虑将最左下的点设为原点(事实上任意点均可作为原点),然后其余各点根据斜率排序。

对于每一个节点,我们考虑加入它是否会与已有的边点构成内凹,如果会,那么放弃已有边点。

显然我们可以通过维护一个单调栈完成该过程。

代码

#include <bits/stdc++.h>

using namespace std;

namespace StandardIO {

    template<typename T>inline void read (T &x) {
        x=0;T f=1;char c=getchar();
        for (; c<'0'||c>'9'; c=getchar()) if (c=='-') f=-1;
        for (; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';
        x*=f;
    }

    template<typename T>inline void write (T x) {
        if (x<0) putchar('-'),x*=-1;
        if (x>=10) write(x/10);
        putchar(x%10+'0');
    }

}

using namespace StandardIO;

namespace Project {

    const int N=5005;
    const double eps=1e-9;

    int n,top;
    double ans;
    struct node {
        int x,y;
        double rad;
        node () {}
        node (int _x,int _y) : x(_x),y(_y) {}
        friend node operator + (const node &x,const node &y) {
            return node(x.x+y.x,x.y+y.y);
        }
        friend node operator - (const node &x,const node &y) {
            return node(x.x-y.x,x.y-y.y);
        }
        friend int operator * (const node &x,const node &y) {
            return x.x*y.y-x.y*y.x;
        }
        friend bool operator < (const node &x,const node &y) {
            return (x.x==y.x)?(x.y<y.y):(x.x<y.x);
        }
    } a[N],S[N];

    inline double dist (const node &x,const node &y) {
        return sqrt((y.x-x.x)*(y.x-x.x)+(y.y-x.y)*(y.y-x.y));
    }
    inline bool cmp (const node &x,const node &y) {
        double k=(x-a[1])*(y-a[1]);
        if (fabs(k)<=eps) return dist(x,a[1])<dist(y,a[1]);
        return k>eps;
    }
    inline double rad (node x,node y) {
        return atan2(y.y-x.y,y.x-x.x);
    }

    inline void MAIN () {
        read(n);
        for (register int i=1; i<=n; ++i) {
            read(a[i].x),read(a[i].y);
        }
        sort(a+1,a+n+1);
        sort(a+2,a+n+1,cmp);
        S[++top]=a[1],S[++top]=a[2];
        for (register int i=3; i<=n; ++i) {
            while ((S[top]-S[top-1])*(a[i]-S[top-1])<=0) --top;
            S[++top]=a[i];
        }
        S[top+1]=a[1];
        for (register int i=1; i<=top; ++i) {
            ans+=dist(S[i],S[i+1]);
        }
        printf("%.2lf",ans);
    }

}

int main () {
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    Project::MAIN();
}

原文地址:https://www.cnblogs.com/ilverene/p/11372811.html

时间: 2024-08-04 00:23:19

护城河的挖掘「USACO 2006」的相关文章

产奶模式「USACO 2006」

[题目描述] 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". John的牛奶按质量可以被赋予一个\(0\)到\(1000000\)之间的数.并且John记录了\(N(1\le N\le 20000)\)天的牛奶质量值.他想知道最长的出现了至少\(K(2\le K\le N)\)次的模式的长度.比如1 2 3 2 3 2 3 1 中 2 3 2 3出现了两次.当\(K=2\)时,

队列变换「USACO 2007」

[题目描述] FJ打算带他的\(N(1 \leq N \leq 30,000)\)头奶牛去参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所有队伍中奶牛名字的首字母取出,按它们对应奶牛在队伍中的次序排成一列(比如说,如果FJ带去的奶牛依次为Bessie.Sylvia.Dora,登记人员就把这支队伍登记为BSD).登记结束后,组委会将所有队伍的登记名称按字

大數據時代浪潮的「弄潮兒」

進入2015年,海量的數據正在迅速膨脹並變大,它決定著企業的未來發展,雖然現在企業可能並沒有意識到數據爆炸性增長帶來的問題的隱患,但是隨著時間的推移,人們將越來越多的意識到數據對企業的重要性. 面臨海量數據的挑戰 大數據(big data)是時下非常熱門的話題,大數據是用來描述和定義信息爆炸時代產生的海量數據.大數據的發展能夠為人們獲得更為深刻.全面的洞察能力提供前所未有的空間與潛力,那麼如何看待大數據給IT市場帶來的機遇和挑戰呢? 紐約時報網站此前刊載文章稱,大數據時代已經來臨並且正在對每個領

「豆瓣时间」

变着花样,「豆瓣时间」的广告页已经在豆瓣App上轮播了一周.豆瓣er们被雨果.普希金.菏尔德林等大师邀请了那么多天,终于在今天见到这档付费音频节目的真面目. 今天是2017年3月7日,距分答上线近一年,距喜马拉雅FM“123知识狂欢节”过去3个月.如今,罗胖正在炮制概念的路上狂奔,知乎已然形成付费矩阵,科技媒体Pro版遍地开花. 以文艺青年为主要用户群的豆瓣,却还是秉持“慢工出细活”的态度,除了原创+打赏的标配功能,去年最大的动作就是阿北宣布要进军影业.虽然每个行为都指向内容,但都没真正涉及支付

「产品经理」和「功能经理」的差别

作者:BMAN 产品经理最主要的职责就是懂需求. 看上去好像非常easy.实际上,非常多产品经理都做不到这一点. 举一个样例,就拿红包这个简单的功能来讲,产品经理怎样满足用户需求呢? 好的产品经理会用最简单的功能去满足用户的需求,把核心功能打磨地异常瑞丽. 而有一类糟糕的产品经理,我称之为 "功能经理",他们不断给产品添加新功能.duang duang duang 给产品加一堆特技,觉得这样就行满足用户需求了: watermark/2/text/aHR0cDovL2Jsb2cuY3Nk

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

「C语言」常量和变量的表示及应用

先发布,还在修改完善中.. 在程序运行中,其值不能改变的量成为常量.在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 整型常量 即整常数,由一个或多个数字组成,可以带正负号 C语言中整型常量可用十进制.八进制和十六进制3种形式表示 十进制整数:由0~9数字组成,不能以0开始,没有前缀 八进制整数:以0为前缀,其后由0~7的数字组成,没有小数部分 十六进制整数:以0x或0X开头,其后由0~9的数字和a~f(或A~F字母组成) 另外长

Chrome 扩展 Stylish :给不喜欢某个网站一键「换肤」

原文地址:http://whosmall.com/?post=419 本文标签: Chrome扩展 Chrome浏览器 Chrome插件 Chrome扩展Stylish Stylish是什么 Stylish 是什么? 开门见山,Stylish 的作用是,它可以把百度首页变成这样: 它还能把知乎「拍扁」,让微博网页版变得简洁无比,让 Feedly 用上Material Design-- 这个神奇的 Stylish实际上是一个浏览器插件,适用于 Chrome,Firefox,Opera 以及 Saf

bzoj1670【Usaco2006 Oct】Building the Moat 护城河的挖掘

1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 387  Solved: 288 [Submit][Status][Discuss] Description 为了防止口渴的食蚁兽进入他的农场,Farmer John决定在他的农场周围挖一条护城河.农场里一共有N(8<=N<=5,000)股泉水,并且,护城河总是笔直地连接在河道上的相邻的两股泉水.护城河必须能保护