@okokme
2019-07-22T03:23:11.000000Z
字数 893
阅读 630
算法week1
题目:
链接:https://www.nowcoder.com/questionTerminal/d732267e73ce4918b61d9e3d0ddd9182?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网
小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。
输出一个数表示小Q第一天最多能吃多少块巧克力。
输入
3 7
输出
4
//后一天要比前一天多,或者相等//二分查找从1到M查找第一天吃的巧克力数,求得按照要求的最低的标准(不少于前一天的一半)//暴力循环//(N<=50000) (N<=M<=100000)#include <iostream>using namespace std;int sum(int s,int day){int sum=0;for(int i=0; i<day; i++){sum+=s;s=(s+1)/2;}return sum;}int SearchMax(int total, int day){int low = 1;int high = total;if(total == day)return 1;if(day == 1)return total;while(low < high){int mid = (low+high+1)/2; //(low+high)/2为什么不行?if(sum(mid,day) == total)return mid;else if(sum(mid,day) <total )low = mid;elsehigh = mid-1;}return high;}int main(){int M,N;cin>>N>>M;int one = SearchMax(M,N);cout<<one<<endl;return 0;}
注意二分法的边界控制