- 这是一个带上边界(靠近M)的自定义版本的二分查找。
- 具体注意事项看备注(边界条件)
#include<bits/stdc++.h>
using namespace std;
int N,M;
//计算第一天吃s个巧克力一共需要多少个多少个巧克力
int sum(int s){
int sum = 0;
for(int i = 0; i< N; i++){
sum+=s;
//第二天吃的巧克力,向上取整,因为不小于一半(对于奇数,会向上,对于偶数不变)
s = (s+1)>>1;
}
return sum;
}
int chocolate(){
if(N==1) return M;
int low = 1;//注意
int high = M;//注意
while(low<high){//注意
int mid = (low+high +1 )>>1;//记得要加一
int choco_sum = sum(mid);
if(choco_sum==M) return mid;//这个就是最大得限度。
else if(choco_sum<M){
low = mid;//注意
}else{
high = mid - 1;//注意
}
}
return high;//那个第一天吃得最多得巧克力数。 //注意
}
int main() {
cin >>N>>M;
int res = chocolate();
cout<<res<<endl;
return 0;
}