链接:https://www.nowcoder.com/test/10611931/summary
[编程题] 贪吃的小Q
时间限制:1秒
空间限制:32768K
小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。
输出描述:
输出一个数表示小Q第一天最多能吃多少块巧克力。
输入例子1:
3 7
输出例子1:
4
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int n,m;
int getsum(int a){//第一天是a
int sum = 0;
for(int i=0;i<n;i++){
sum += a;
a = (a+1)>>1;//向上取整
}
return sum;
}
int main(){
cin>>n>>m;
int low = 1,high = m,mid;//因为第一天的在1-m之间,所以采用二分查找,时间复杂度到O(logn)
while(low <= high){
mid = (low+high)>>1;//右移一位来除2
if(getsum(mid) == m){
cout<<mid<<endl;
return 0;
}
else if(getsum(mid) > m)
high = mid - 1;
else
low = mid + 1;
}
cout<<high<<endl;
return 0;
}