标签:
2016暑假多校联合---Windows 10(HDU:5802)
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; typedef long long ll; ll sum[50]; ll ans,a,b; void init() { sum[0]=0; for(ll i=1; i<=33; i++) sum[i]=(1<<i)-1; } ll dfs(ll x,ll step,ll stop) { if(x==b)return step; ///x 当前位置,等于b 时退出当前栈 int k=0; while(x-sum[k]>b) //到k值,向下跳k步后 使得当前位置小于等于b位置 k++; if(x-sum[k]==b) return step+k; ///刚好跳到b位置 ll up =b-max((ll)0,x-sum[k]);///x-sum[k] 在b下面 --> 向上跳的步数并且最多走到0位置 ll res=k+max((ll)0,up-stop); ///加入走了k步,再往上走,总共 k+up-stop 步 ///up - stop ,往上走就不需要停顿了,up的步数比停顿的多 用up 顶替停顿, return min(step+res,dfs(x-sum[k-1],step+k,stop+1));///取现在向上反 和继续向下跑的最小的那个 } int main() { init(); int t; scanf("%d",&t); while(t--) { scanf("%lld%lld",&a,&b); if(a<=b) { printf("%lld\n",b-a); continue; } else printf("%lld\n",dfs(a,0,0)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5745960.html