「CodeForces - 50C 」Happy Farm 5 (几何)
BUPT 2017 summer training (16) #2B
题意
有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数。
题解
这题要求严格包含的路径。实际上答案就是不严格包含的+4步。
也可以加上每个点上下左右的四个点再跑凸包。
最少步数就是凸包上相邻两点的\(max(\Delta x,\Delta y)\)之和。
其实这题也可以不求凸包,用平行于对角线的四条边非严格包含地去围这些点,若相交的地方不在格点上,我们四边都往外扩展后,也是+4步就得到严格包含的路径。
然后因为斜着一步和水平的一步是等价的,所以步数其实就是四边形路径的x差值*2加4。
设a=max(x+y),c=min(x+y),b=max(x-y),d=min(x-y)。四条边分别是x+y=a,x+y=c,x-y=b,x-y=d。
然后求出四个交点的最大的x就是(a+b)/2,最小的x就是(c+d)/2
于是x差值*2就是((a+b)/2-(c+d)/2)*2=a+b-c-d
代码
#include <cstdio>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int main(){
int n,a,b,c,d;
a=b=-inf;c=d=inf;
scanf("%d",&n);
for(int i=1,x,y;i<=n;++i){
scanf("%d%d",&x,&y);
a=max(x+y,a);
b=max(x-y,b);
c=min(x+y,c);
d=min(x-y,d);
}
printf("%d",a+b-c-d+4);
return 0;
}
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆