题目描述:
给出一个正整数H,从1开始减,第一次必须减1,每次减的数字都必须和上一次相同或者是上一次的两倍,请问最少需要几次能把H恰好减到0。
思路:
因为每次减的数字都必须和上一次相同或者是上一次的两倍,所以2^ 0+2^ 1+2^ 2+2^ 3+...+2^ n必定都存在,且n为H>= 2^ 0+2^ 1+2^ 2+2^ 3+...+2^ n中的那个最大的n;H减去2^ 0+2^ 1+2^ 2+2^ 3+...+2^ n后剩下的数就可以和1~2^n中2的平方数组合,再尽量选大的。
代码:
include<bits/stdc++.h>
using namespace std;
long long h;
int t;
int ans,cnt;
int tt;
int main()
{
cin>>t;
while(t--){
cin>>h;
ans=1;
cnt=1;
tt=0;
for(int i=1;ans<=h;i++){
ans+=pow(2,i);
cnt++;
}//找出那个最大的N
ans-=pow(2,cnt-1);
cnt--;
for(int i=cnt;i>=0;i--){
if(ans+pow(2,i)==h){
tt++;
break;
} //选出的数和为H
else if(ans+pow(2,i)<h){
ans+=pow(2,i);
tt++;
}//选出的数和不到H
}
cout<<cnt+tt<<endl;
}
return 0;
}