其他分享
首页 > 其他分享> > 题解 P7885 「MCOI-06」Flight

题解 P7885 「MCOI-06」Flight

作者:互联网

题目由此去


  1. 将起点移动到终点一列或者一行(台阶型移动,因为“相邻两步不能向同一个方向走!”),但是这里要特判一下是走到同一列短,还是同一行短。

  2. 判断过后,就把起点移过去,由于这里是台阶型所以\(ans*=2\)

  3. 再来一个特判,判断最后在同一行/列走到终点有多少格。

令 $ len= $ 走到终点的格子数

\(\begin{cases}ans+=len*2&len \in N,x \mid x=2*len \\ans+=len*2-1&len \in Z,x \mid x=2*len+1\end{cases}\)

偶数情况:image

奇数情况:image


AC代码如下:

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;

long long a,b,c,d;

signed main() {
	int t;
	cin>>t;
	while(t--) {
		scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
		int ac = abs(a - c);
		int bd = abs(b - d);
		int ans = min(ac, bd);
		ac -= ans;
		bd -= ans;
		ans *= 2;
		if(!ac && !bd) {
			printf("%lld\n", ans);
			continue;
		}
		if(ac) {
			if(ac % 2) ans-- ;
			ans += 2 * ac;
		}
		if(bd) {
			if(bd % 2) ans-- ;
			ans += 2 * bd;
		}
		printf("%lld\n", ans);
	}
	return 0;
}

标签:bd,ac,06,int,题解,len,long,ans,Flight
来源: https://www.cnblogs.com/VectorCy/p/15366543.html