列表

详情


NC218864. 反复横跳

描述

牛牛在位置,牛妹在位置,初始时,牛牛每次可以执行以下操作之一:

  1. 跳:牛牛从当前所在位置跳到,随后
  2. 重置:令

求当牛牛的策略足够优秀时,从走到牛妹身边所需要执行的最少操作次数。

输入描述

第一行两个整数

输出描述

输出一行一个整数表示答案。

示例1

输入:

1 5

输出:

5

说明:

第一步执行”跳“,此时牛牛走到2这个位置。第二步执行”跳”,此时牛牛走到0这个位置。第三步执行“跳”,此时牛牛走到4这个位置。第四步执行“重置”。第五步执行“跳”操作,走到5这个位置。

示例2

输入:

3 2

输出:

2

说明:

第一步执行“跳”,此时牛牛走到4这个位置。第二步执行“跳”,走到2这个位置。

示例3

输入:

998 998

输出:

0

示例4

输入:

555 666

输出:

31

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 44ms, 内存消耗: 48864K, 提交时间: 2021-04-24 14:48:56

#include <cstdio>
#include <algorithm>

using namespace std;

bool b[500000][20];
int gx[10000000],gy[10000000],gz[10000000],h[10000000];
int x,y,z,H,T;

int main()
{
	scanf("%d%d",&x,&y);
	T=1,gx[T]=y-x,gy[T]=0,gz[T]=-1,h[T]=0,b[250000+gx[T]][gy[T]]=true;
	for (H=1;H<=T;H++)
	{
		if (! gx[H])
		{
			printf("%d",h[H]);
			return 0;
		}
		x=gx[H],y=gy[H],z=gz[H];
		if ((abs(x+(1<<y)*z)<=150000) && (! b[250000+x+(1<<y)*z][y+1]))
			T++,gx[T]=x+(1<<y)*z,gy[T]=y+1,gz[T]=-z,h[T]=h[H]+1,b[250000+gx[T]][gy[T]]=true;
		if (! b[250000+x][0])
			T++,gx[T]=x,gy[T]=0,gz[T]=-1,h[T]=h[H]+1,b[250000+gx[T]][gy[T]]=true;
	}
}

Python3(3.9) 解法, 执行用时: 1132ms, 内存消耗: 11036K, 提交时间: 2021-04-27 19:02:29

s, t = map(int, input().split())
ma = {0: 0, 1: 1}
tmp, op, M = 0, 1, 40000
while abs(tmp) < M:
    ma[tmp + op] = ma[tmp] + 1
    tmp += op
    op *= -2
dp = {i: float('inf') for i in range(-M, M)}
for x in ma:
    dp[x] = ma[x]
for x in ma:
    for y in range(-M, M):
        if y - x in dp:
            dp[y] = min(dp[y], dp[y - x] + ma[x] + 1)
print(dp[t - s])
# mstdy dalao tql

上一题