hdu 5802 Windows 10
官方题解:
Windows 10
_您可能是正版Windows 10的受害者_ 直接贪心就好
比较直观的看法是使劲往下降,然后升回来
或者使劲往下降然后停顿然后再使劲往下降。。。
于是就能将问题变成一个子问题,然后dfs就好
需要注意的是由于按up键也可以打断连续向下的功效
所以应该记录停顿了几次,以后向上的时候用停顿补回来
/*by*/ #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long LL; const LL N=500; const LL INF=0x3f3f3f3f; LL p,q; int main() { LL T; cin>>T; while(T--) { scanf("%lld%lld",&p,&q); if(p<=q) { printf("%lld\n",q-p); continue; } LL ans=INF,down=1,s=0,st=0;/*s:操作次数;st:停顿的次数*/ while(p>=q){ p-=down; down<<=1; s++; if(p<=q){ if(q-p<=st){/*向上操作次数可以被停顿的次数代替*/ ans=min(ans,s+st); break; } LL tmp=max(q-max(p,(LL)0),st);/*音量大于0*/ ans=min(ans,tmp+s); down>>=1; p+=down; down=1; st++; s--; } } printf("%lld\n",ans); } return 0; }