CF1044C题解

题目大意:

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

题目分析:

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

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

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

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

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

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

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

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

注:

看到数据范围 108xi,yi108 一定要记得开 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;
}
posted @   Code_AC  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示