思路
为什么贪心题/搜索题也可以这么难TAT
对于给定的n,m,如果
n≤m
可以直接给出答案
对于
n>m
的情况
答案会出现在一直往下减再往上加和一直往下减休息几次再减之中
- 如果 cur>tar 的情况,可以一直往下减
- 休息一下的次数可以用来抵消往上加的次数
- 题目说不能减到0以下,是指如果减了会小于0,那么音量变成0(不是说不能减)
- 任何时候执行加法效果都是一样的
代码
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=a;i<b;i++)
#define debug(a) printf("a =: %d\n",a);
const int INF=0x3f3f3f3f;
const int maxn=1e6+50;
const int Mod=1000000007;
const double PI=acos(-1);
typedef long long ll;
using namespace std;
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int T,cur,tar;
scanf("%d",&T);
while(T--){
scanf("%d %d",&cur,&tar);
if (cur<=tar) printf("%d\n", tar-cur);
else{
int ans=INF,waitCnt=0,downCnt=0;
int x=1;
while(cur>=tar){
// cout<<cur<<" "<<tar<<endl;
downCnt++;
cur-=x;
x<<=1;
if (cur<=tar){
if (tar-cur<=waitCnt){
ans=min(ans,downCnt+waitCnt);
}else{
ans=min(ans,downCnt+max(tar-max(cur,0),waitCnt));
//wait
waitCnt++;
x>>=1;
cur+=x;
x=1;
downCnt--;
}
}
}
printf("%d\n",ans);
}
}
return 0;
}