题解 CF1713A

题解 CF1713A

这个题其实并不难

因为要便利所有的点并且左右的点都是在坐标系轴上

并且这里的移动只能是上下左右水平移动

所以我们最后走出来的图形,一定是个多边形

然后让我们看一下这张图片

我们会发现,这里走 A 路径,和走 B 路径所用的步数是完全相同的

所以,最终走出来的这个路径一定是一个规整的矩阵

我们观察一下,就会发现,这个矩阵的周长会受 4 个点的影响

分别是 \(X_{max}\) , \(Y_{max}\) , \(X_{min}\) , \(Y_{min}\)

所以,我们只需要在读入的时候将这四个点处理出来,就行了

这里有一点需要注意,因为最终要回到原点,所以,我们的转化前的路径一定是要经过 \((0,0)\) 这个点的

所以,我们的 \(X_{max}\) , \(Y_{max}\) , \(X_{min}\) , \(Y_{min}\) 在初始化时,应该都设为 0 这样才能保证他的点在一边时,可以回到原点

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<stack>
#include<map>
#define Max(x,y) x>y?x:y
#define Min(x,y) x<y?x:y
using namespace std;
int T; 
int main(){
	scanf("%d",&T);
	while(T--){
		int n,fx,fy,maxn_x=0,maxn_y=0,minn_x=0,minn_y=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d %d",&fx,&fy);
			maxn_x=Max(maxn_x,fx);
			maxn_y=Max(maxn_y,fy);
			minn_x=Min(minn_x,fx);
			minn_y=Min(minn_y,fy);
		}
//		printf("%d %d %d %d",maxn_x,maxn_y,minn_x,minn_y);
		printf("%d\n",(maxn_x-minn_x+maxn_y-minn_y)*2);
	}
    return 0;
}
posted @ 2022-11-30 09:15  Tyrue  阅读(14)  评论(0编辑  收藏  举报