分析:
比赛的时候没考虑到可以用上升替代停顿的情况。。。。题解:
直接的做法是比较 往下降,然后升回来和往下降然后停顿或者上升一些后再开始下降的取值,于是可以化成一个自问题,不断递归DFS即可。
PS:需要记录停顿的次数,然后需要向上的时候就可以用停顿不上去。标程:
#include <cstdio>
#include <algorithm>
using namespace std;
int T;
long long P, Q;
long long dfs(long long S, long long T, long long step, long long stop)
{
if (S == T)
return step;
long long x = 0;
while (S - (1 << x) + 1 > T)
x++;
if (S - (1 << x) + 1 == T)
return step + x;
long long up = (T - max((long long)0, S - (1 << x) + 1));
long long tmp = x + max((long long)0, up - stop);
return min(tmp + step, dfs(S - (1 << (x - 1)) + 1, T, step + x, stop + 1));
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%lld%lld", &P, &Q);
if (Q >= P)
{
printf("%lld\n", Q - P);
continue;
}
printf("%lld\n", dfs(P, Q, 0, 0));
}
return 0;
}