NC218864. 反复横跳
描述
牛牛在位置,牛妹在位置,初始时,牛牛每次可以执行以下操作之一:
求当牛牛的策略足够优秀时,从走到牛妹身边所需要执行的最少操作次数。
输入描述
第一行两个整数。
输出描述
输出一行一个整数表示答案。
示例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