- 这是一个带上边界(靠近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; }