1. 程式人生 > 其它 >HashMap擴容-多執行緒不安全和ConcurrentHashMap

HashMap擴容-多執行緒不安全和ConcurrentHashMap

\[\text{題目大意} \]

\(\quad\)求從一個點到另一個點所需的距離,相鄰兩步不能向同一個方向走。

\[\text{思路} \]

\(\quad\)可以發現答案至少是兩個點的曼哈頓距離 ,題目的意思是 \(x,y\) 方向上移動的長度相等或相差 \(1\),設 \(a\)\(b\) 分別表示 \(x\)\(y\) 方向上的距離差。

\(\quad\)顯然如圖,當起點和終點在一條斜線上的時候(即 \(abs(a-b)<=1\)),此時的答案就是曼哈頓距離,如 \((0,0)->(3,4)=7,(0,0)->(4,4)=8\),可以發現沿斜線走是最優的,答案 \(ans=a+b\)。(沒有浪費步數且滿足條件)

\(\quad\)當不滿足最優情況的時候,顯然意味著要浪費步數,我們可以先沿斜線使得在同一條水平線或豎直線上,假設 \(a>b+1\),然後在沿 \(x\) 方向的時候,\(y\) 方向顯然就要左右橫跳,就是按下圖的方式走。

\(\quad\)此時距離為 \(abs(a-b)\),答案 \(ans=min(a,b)\times2+\)\(abs(a-b)/2\)\(\times 4+(abs(a-b)\mod 2)\)

\(\quad\)最後記得開long long。

#include<iostream>
#include<cstdio>
using namespace std;
#define int long long
int q,a,b,c,d;
inline int min(int x,int y){return x<=y?x:y;}
signed main()
{
	cin>>q;
	while(q--){
		cin>>a>>b>>c>>d;
        a=abs(a-c);b=abs(b-d);
		if(abs(a-b)<=1)printf("%lld",a+b),putchar('\n');
		else {
			int x=abs(a-b);
			if(x&1)printf("%lld\n",min(a,b)*2+(x-1)*2+1);
            else printf("%lld\n",min(a,b)*2+x*2);
		}
	}
	return 0;
}