题解
一开始很容联想到二叉树的结构,初始的杯子数就是子节点,两个相邻子变父,这样不断往上走。
当然其实和树没有什么关系只是可以形象化理解。
容易知道任何 2^k个水杯都可以最后合成 1 个,那么我们只要不断地对现有的杯子求 <= 当前杯子数的
2^k,然后n减去2^k,这表示这么多的杯子可以合成一个,所以再 k–,如此往复直到 k==1,这时所剩
的杯子数目 n 就必须想能办法合成一个,如若不能那添加的数就是答案。
Code
// head files excluded
using namespace std;
int n,m;
int cot[33];
int main(){
cin>>n>>m;
int pd;
pd=1;
for(int i=0;i<32;i++){
cot[i] = pd;
pd*=2;
}
while(m!=1){
pd = 0;
while(cot[pd]<=n){
pd++;
}
pd--;
n-= cot[pd];
m--;
}
if(n==0){
cout<<0<<endl;
return 0;
}
pd=0;
while(cot[pd]<n) pd++;
cout<<cot[pd]-n<<endl;
return 0;
}