CF419B的题解

(一)

最简洁易懂的代码。

这题很明显就是曼哈顿距离切比雪夫距离

设点 \(A=(x,y)\)\(B=(xx,yy)\)\(Dis(A,B)=\vert x-xx\vert +\vert y-yy\vert\)

观察上面这个式子,不太好求,考虑转化为一堆数取最大的形式。

\(x1=x+y\)\(y1=x-y\)\(x2=xx+yy\)\(y2=xx-yy\)

\(Dis(A,B)=max(x1-x2,y1-y2)\),自己可以分讨算一下。

那么直接记录 $n $ 个人的位置中最小和最大的 \(x1\)\(y1\)

(二)

记得开 long long。

AC 代码。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18;
int x,y,n,m,mnx=inf,mxx=-inf,mxy=-inf,mny=inf,ans=inf,ansid;
signed main(){
	scanf("%lld%lld",&x,&y);
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld%lld",&x,&y);
		mnx=min(mnx,x+y),mxx=max(mxx,x+y);
		mny=min(mny,x-y),mxy=max(mxy,x-y);
	}
	scanf("%lld",&m);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&x,&y);
		int xx=x,yy=y;
		x=xx+yy,y=xx-yy;
		int s=max(max(abs(x-mnx),abs(x-mxx)),max(abs(y-mny),abs(y-mxy)));
		if(s<ans)ans=s,ansid=i;
	}
	printf("%lld\n%lld\n",ans,ansid);
	return 0;
} 
posted @ 2024-04-19 08:25  Jerry_heng  阅读(16)  评论(0编辑  收藏  举报