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

原题链接

题解

这么优质的文章我写什么题解

好难解释必然性感觉像模拟??

code

#include<bits/stdc++.h>
using namespace std;
int q[100005]={0};
struct node
{
    double x,y;
}a[100005];

double dis(int b,int c)
{
    node i=a[b],j=a[c];
    return sqrt((i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y));
}

bool cmp(node b,node c)
{
    if(b.x!=c.x) return b.x<c.x;
    return b.y>c.y;//贪心地往小的圈
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].x>>a[i].y;
    }

    sort(a+1,a+n+1,cmp);

    q[1]=1;
    q[2]=2;
    int top=2;
    for(int i=3;i<=n;i++)//扫下边
    {
        while(top>1)
        {
            double x1=a[q[top]].x-a[q[top-1]].x,y1=a[q[top]].y-a[q[top-1]].y;
            double x2=a[i].x-a[q[top]].x,y2=a[i].y-a[q[top]].y;
            if(x1*y2-x2*y1<=0)top--;
            else break;
        }
        q[++top]=i;
    }

    int top1=top;
    q[++top]=n-1;
    for(int i=n-2;i>=1;i--)//扫上边
    {
        while(top>top1)
        {
            double x1=a[q[top]].x-a[q[top-1]].x,y1=a[q[top]].y-a[q[top-1]].y;
            double x2=a[i].x-a[q[top]].x,y2=a[i].y-a[q[top]].y;
            if(x1*y2-x2*y1<=0)top--;
            else break;
        }
        q[++top]=i;
    }
    double ans=0;
    for(int i=1;i<=top;i++)
    {
        //printf("%d:%d\n",i,q[i]);
        ans+=dis(q[i],q[i%top+1]);
    }

    printf("%.2lf",ans);
    return 0;
}

posted @   纯粹的  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示