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