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

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

题目描述

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

输入输出格式

输入格式:

 

输入数据的第一行包括一个整数 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;
}

 

目录
相关文章
|
3天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1090 152
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1756 9
|
10天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
697 152
|
12天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
661 13
|
6天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
452 5