[关闭]
@okokme 2019-07-22T03:23:11.000000Z 字数 893 阅读 448

贪吃的小Q

算法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第一天最多能吃多少块巧克力。

示例1

输入
3 7
输出
4

  1. //后一天要比前一天多,或者相等
  2. //二分查找从1到M查找第一天吃的巧克力数,求得按照要求的最低的标准(不少于前一天的一半)
  3. //暴力循环
  4. //(N<=50000) (N<=M<=100000)
  5. #include <iostream>
  6. using namespace std;
  7. int sum(int s,int day)
  8. {
  9. int sum=0;
  10. for(int i=0; i<day; i++)
  11. {
  12. sum+=s;
  13. s=(s+1)/2;
  14. }
  15. return sum;
  16. }
  17. int SearchMax(int total, int day)
  18. {
  19. int low = 1;
  20. int high = total;
  21. if(total == day)
  22. return 1;
  23. if(day == 1)
  24. return total;
  25. while(low < high)
  26. {
  27. int mid = (low+high+1)/2; //(low+high)/2为什么不行?
  28. if(sum(mid,day) == total)
  29. return mid;
  30. else if(sum(mid,day) <total )
  31. low = mid;
  32. else
  33. high = mid-1;
  34. }
  35. return high;
  36. }
  37. int main()
  38. {
  39. int M,N;
  40. cin>>N>>M;
  41. int one = SearchMax(M,N);
  42. cout<<one<<endl;
  43. return 0;
  44. }

注意二分法的边界控制

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注