洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows

题目描述

农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。

输入输出格式

输入格式:

输入数据的第一行包括一个整数 N。N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目。接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000)。数字用小数表示。

输出格式:

输出必须包括一个实数,表示必须的围栏的长度。答案保留两位小数。

输入输出样例

输入样例#1:

4
4 8
4 12
5 9.3
7 8

输出样例#1:

12.00

说明

题目翻译来自NOCOW。

USACO Training Section 5.1

解题思路

  一道裸的凸包周长。

  凸包周长~直径多长~一进考场~全都忘光——

  我是从这里学到的姿势,直接上模板吧。

  还有,极角排序不能用斜率!要用叉积!

源代码

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;

int n;

struct node{
    double x;
    double y;
    double k;
    bool operator < (const node & a) const{//极角排序
        if(fabs(k-a.k)<1e-5)
        {
            return (x*x+y*y)<(a.x*a.x+a.y*a.y);
        }
        return (k<a.k);
    }
}p[100010];

double X(node a,node b,node c)//叉积
{
    double x1=b.x-a.x,y1=b.y-a.y;
    double x2=c.x-a.x,y2=c.y-a.y;
    return x1*y2-x2*y1;
}

double len(node a,node b){return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );}//勾股 

node s[100010]={0};
int top=0;

int main()
{
    scanf("%d",&n);
    if(n==1||n==0){printf("0");return 0;}
    for(int i=1;i<=n;i++)//输入
    {
        double x,y;
        scanf("%lf%lf",&x,&y);
        p[i]={x,y};
        if(p[i].y<p[1].y) swap(p[1],p[i]);
        else if(fabs(p[i].y-p[1].y)<1e-6&&p[i].x<p[1].x) swap(p[1],p[i]);
    }
    if(n==2){printf("%lf",len(p[1],p[2]));return 0;}
    for(int i=2;i<=n;i++)//挪原点
    {
        p[i].x-=p[1].x;
        p[i].y-=p[1].y;
        p[i].k=p[i].y/p[i].x;
    }
    p[1]={0.0,0.0};
    sort(p+2,p+1+n);
    s[top++]=p[1];
    s[top++]=p[2];
    p[++n]=p[1];
    for(int i=3;i<=n;i++)//求凸包
    {
        while(top!=0&&X(s[top-2],s[top-1],p[i])<0)top--;
        s[top++]=p[i];
    }
    double ans=0;
    //for(int i=1;i<=n;i++) printf("^%lf^%lf^\n",p[i].x,p[i].y);
    do//求周长
    {
        ans+=len(s[top-1],s[top-2]);
        top--;
    }while(top);
    printf("%.2lf\n",ans);
    return 0;
}
时间: 2024-08-07 07:32:04

洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows的相关文章

P2742 [USACO5.1]圈奶牛Fencing the Cows

题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入格式: 输入数据的第一行包括一个整数 N.N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目.接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000).数字用小数表示. 输出格式

P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows

题意:n个点,求凸包周长.(纯板子QAQ) 定义 凸包:用最小的凸多边形将n个点围在里面的图形为凸包 前置 向量:点积:(a,b) (c,d)=(a*c,b*d) =|(a,b)|*|(c,d)|*cos<(a,b),(c,d)>; 叉积:(a,b) (c,d)=a*d-b*c=|(a,b)|*|(c,d)|*sin<(a,b),(c,d)>;  几何意义:以(a,b)(c,d)两向量作平行四边形,它俩的叉积为其面积 故有三角形面积=$\large{\frac{1}{2}*|(a,

洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的方格的列表.你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚.牛棚的边必须和水平轴或者垂直轴平行. EXAMPLE 考虑下面的方格,它表示农夫约翰的农场,‘.'表示没有树的方格,‘#'表示有树的方格 1 2 3 4 5 6 7 8 1 .

洛谷 P1345 [USACO5.4]奶牛的电信Telecowmunication

P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相连,a2与a3相连,等等,那么电脑a1和a(c)就可以互发电邮. 很不幸,有时候奶牛会不小心踩到电脑上,农夫约翰的车也可能碾过电脑,这台倒霉的电脑就会坏掉.这意味着这台电脑不能再发送电邮了,于是与这台电脑相关的连接也就不可

洛谷 1345 [USACO5.4]奶牛的电信Telecowmunication

题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相连,a2与a3相连,等等,那么电脑a1和a(c)就可以互发电邮. 很不幸,有时候奶牛会不小心踩到电脑上,农夫约翰的车也可能碾过电脑,这台倒霉的电脑就会坏掉.这意味着这台电脑不能再发送电邮了,于是与这台电脑相关的连接也就不可用了. 有两头奶牛就想:如果我们两个不能互发电邮,至少需要坏掉多少台电脑呢?请

洛谷P1709 [USACO5.5]隐藏口令Hidden Password

P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<=5,000,000),然后他把S顺时针绕成一个圈,每次取一个做开头字母并顺时针依次取字母而组成一个字符串.这样将得到一些字符串,他把它们排序后取出第一个字符串.把这个字符串的第一个字母在原字符串中的位置-1做为口令. 如字符串alabala,按操作的到7个字符串,排序后得: aalabal abalaal a

洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(不明原因的scanf错误)

P1560 [USACO5.2]蜗牛的旅行Snail Trails 题目描述 萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <= 120). 她总是从棋盘的左上角出发.棋盘上有空的格子(用“.”来表示)和B 个路障(用“#”来表示). 下面是这种表示法的示例棋盘: 萨丽总是垂直(向上或者向下)或水平(向左或者向右)地走.她可以从出发地(总是记作A1 )向下或者向右走.一旦萨丽选定了一个方向,她就会一直走下去.如果她遇到棋盘边缘或者路障,她就停下来,并且

洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn

P2701 [USACO5.3]巨大的牛棚Big Barn 题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的方格的列表.你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚.牛棚的边必须和水平轴或者垂直轴平行. EXAMPLE 考虑下面的方格,它表示农夫约翰的农场,‘.'表示没有树的方格,

洛谷——P2701 [USACO5.3]巨大的牛棚Big Barn

P2701 [USACO5.3]巨大的牛棚Big Barn 题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的方格的列表.你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚.牛棚的边必须和水平轴或者垂直轴平行. EXAMPLE 考虑下面的方格,它表示农夫约翰的农场,‘.'表示没有树的方格,