关闭

[COGS896]圈奶牛(凸包)

215人阅读 评论(0) 收藏 举报
分类:

题目描述

传送门

题解

凸包裸题,求凸包周长

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 10005

const double eps=1e-9;
int dcmp(double x)
{
    if (x<=eps&&x>=-eps) return 0;
    return (x>0)?1:-1;
}
struct Vector
{
    double x,y;
    Vector(double X=0,double Y=0)
    {
        x=X,y=Y;
    }
    bool operator < (const Vector &a) const
    {
        return x<a.x||(x==a.x&&y<a.y);
    }
};
typedef Vector Point;
Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x,A.y-B.y);}

int n,top;
double x,y,ans;
Point p[N],stack[N];

double Dot(Vector A,Vector B)
{
    return A.x*B.x+A.y*B.y;
}
double Cross(Vector A,Vector B)
{
    return A.x*B.y-A.y*B.x;
}
double Len(Vector A)
{
    return sqrt(Dot(A,A));
}
void Graham()
{
    sort(p+1,p+n+1);
    for (int i=1;i<=n;++i)
    {
        while (top>1&&dcmp(Cross(stack[top]-stack[top-1],p[i]-stack[top-1]))<=0)
            --top;
        stack[++top]=p[i];
    }
    int k=top;
    for (int i=n-1;i>=1;--i)
    {
        while (top>k&&dcmp(Cross(stack[top]-stack[top-1],p[i]-stack[top-1]))<=0)
            --top;
        stack[++top]=p[i];
    }
    if (n>1) --top;
}
int main()
{
    freopen("fc.in","r",stdin);
    freopen("fc.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;++i)
    {
        scanf("%lf%lf",&x,&y);
        p[i]=Point(x,y);
    }
    Graham();
    for (int i=1;i<=top;++i)
        ans+=Len(stack[i]-stack[i%top+1]);
    printf("%.2lf\n",ans);
}
0
0
查看评论

cogs896 圈奶牛(凸包)

描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。 PROGRAM NAME: fc INPUT FORMAT(file fc.in) 输入数据的第一行包括一个整数 N。...
  • wu_tongtong
  • wu_tongtong
  • 2017-04-22 16:50
  • 103

[cogs896]圈奶牛

农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。 PROGRAM NAME: fc INPUT FORMAT(file fc.in) 输入数据的第一行包括一个整数 N。N(0...
  • ScaPrt
  • ScaPrt
  • 2017-04-06 20:40
  • 113

COGS896圈奶牛

圈奶牛 ★★☆ 输入文件:fc.in 输出文件:fc.out 简单对比 时间限制:1 s 内存限制:128 MB USACO/fc(译by Felicia Crazy) 描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所...
  • DCrusher
  • DCrusher
  • 2016-02-27 20:21
  • 185

计算几何 usaco Fencing the Cows 圈奶牛

Description 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。 Input 输入数据的第一行包括一个整数 N。N(0 )表示农夫约翰想要围住...
  • lzr010506
  • lzr010506
  • 2016-03-01 20:14
  • 492

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

题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。 输入输出格式 输入格式: 输入数据的第一行包括一个整数 N。N(0 输出格式:...
  • wyq_cnyali
  • wyq_cnyali
  • 2017-01-18 13:58
  • 114

COGS 896. 圈奶牛 (凸包)

题目描述传送门题目大意:农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。题解凸包裸题。。。。代码#include<iostream> #include<cstd...
  • clover_hxy
  • clover_hxy
  • 2017-04-06 07:34
  • 124

[cogs 896]圈奶牛(凸包)

DESCRIPTION农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。INPUT FORMAT输入数据的第一行包括一个整数 N。N(0 <= N <= 10,000)...
  • zars19
  • zars19
  • 2017-02-17 01:08
  • 127

[USACO5.1]圈奶牛Fencing the Cows(凸包模板)

题目描述 Description给出平面上n个点,求出这n个点形成的凸包的周长。凸包的定义:能覆盖住这个n个点的最小凸多边形。输入描述 Input Description第一行一个整数n,接下来n行,每行两个整数x和y,表示一个点的坐标。数据范围 1 <= n <= 100000-100...
  • qq_37703887
  • qq_37703887
  • 2017-10-08 21:41
  • 77

求凸包 cogs896

cogs炸了,所以暂没有题面。     最基础的板子,因为根据点从左到右,横轴相同纵轴从下到上的顺序排了序,正向一遍求下壳(念什么?qiao:ke)再翻一遍求上壳,出入栈的原理就是根据叉乘逆时针为正,顺时针为负来判断是否外凸。想不明白可以画下图。     ...
  • QTY2001
  • QTY2001
  • 2017-08-05 21:12
  • 102

凸包——Luogu2742 [USACO5.1]圈奶牛Fencing the Cows

传送门 二维凸包裸题 还是按照极角排序(可能我的排序方式怪异一点的) 然后开栈用Graham求出凸包周长即可 由于我交到洛谷上的时间正值本题数据出错的时候,我不敢确定我是不是对的。。。 先放着吧,到时候如果有错再改吧#include<bits/stdc++.h> using n...
  • jzq233jzq
  • jzq233jzq
  • 2017-04-21 15:41
  • 137
    个人资料
    • 访问:649158次
    • 积分:17969
    • 等级:
    • 排名:第627名
    • 原创:1151篇
    • 转载:7篇
    • 译文:0篇
    • 评论:190条
    联系方式
    QQ:1209628538 加好友请备注省份和ID
    E-mail:fiona_2000@126.com
    最新评论