其他分享
首页 > 其他分享> > CF1044C题解

CF1044C题解

作者:互联网

题目大意:

给你 \(n\) 个在平面直角坐标系内的点,然后求出 \(3,4,5...,n\) 边形的最大周长,任意两点间距离为曼哈顿距离。

题目分析:

显而易见,因为距离为曼哈顿距离,所以题目要求的东西就变成了由多个点组成的矩形的周长。

举个例子,如下图,假设我们选择这样四个点:

那么我们要求的矩形长这样:

得到了这个以后,我们还需要分三种情况考虑:

1. 当 \(k \geqslant 4\) 时即我们要求的是一个非三角形的最大周长时,这时就直接取横纵坐标的最大差值求和作为答案就行了。

这个的正确性显然,因为当我们求个非三角形时,就一定能取至少四个点,那么这时,我们一定能保证取到最大的差值。

2. 当 \(k=3\) 时即我们要求的是一个三角形的最大周长时,这时我们就无法像上面那样考虑,样例一就是一个例子。

所以,这个时候我们可以直接枚举求解。

注:

看到数据范围 \(-10^8 \leqslant x_i,y_i \leqslant 10^8\) 一定要记得开 long long。

这里给出核心部分代码:

int main()
{
    n=read();
    long long maxx=-1,minx=0x7f7f7f;
    long long maxy=-1,miny=0x7f7f7f;
    for(register int i=1;i<=n;i++)
    {
        x[i]=read(),y[i]=read();
        maxx=max(maxx,x[i]);
        minx=min(minx,x[i]);
        maxy=max(maxy,y[i]);
        miny=min(miny,y[i]);
    }
    long long sum=(maxx-minx+maxy-miny)*2;
    if(n==3)
    {
        cout<<sum;
        return 0;
    }
    for(register int i=1;i<=n;i++)
    {
        if(x[i]==maxx)
            a[1]=x[i],b[1]=y[i];
        if(x[i]==minx)
            a[2]=x[i],b[2]=y[i];
        if(y[i]==maxy)
            a[3]=x[i],b[3]=y[i];
        if(y[i]==miny)
            a[4]=x[i],b[4]=y[i];
    }
    long long maxn=0;
    for(register int i=1;i<=n;i++)
    {
        maxn=max(maxn,abs(x[i]-minx)+abs(y[i]-miny));
        maxn=max(maxn,abs(x[i]-minx)+abs(y[i]-maxy));
        maxn=max(maxn,abs(x[i]-maxx)+abs(y[i]-maxy));
        maxn=max(maxn,abs(x[i]-maxx)+abs(y[i]-miny));
	}
    cout<<maxn*2<<' ';
    for(register int i=4;i<=n;i++)
    {
        cout<<sum<<' ';
    }
	return 0;
}

标签:题目,周长,题解,long,CF1044C,距离,三角形,我们
来源: https://www.cnblogs.com/yhx-error/p/16558507.html