腾讯----贪吃的小Q
生活随笔
收集整理的這篇文章主要介紹了
腾讯----贪吃的小Q
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
騰訊----貪吃的小Q
文章目錄
- 騰訊----貪吃的小Q
- 一、題目描述
- 二、分析
- 三、代碼
一、題目描述
小Q的父母要出差N天,走之前給小Q留下了M塊巧克力。小Q決定每天吃的巧克力數量不少于前一天吃的一半,但是他又不想在父母回來之前的某一天沒有巧克力吃,請問他第一天最多能吃多少塊巧克力
輸入描述:
每個輸入包含一個測試用例。 每個測試用例的第一行包含兩個正整數,表示父母出差的天數N(N<=50000) 和巧克力的數量M(N<=M<=100000)。輸出描述:
輸出一個數表示小Q第一天最多能吃多少塊巧克力。輸入例子1:
3 7輸出例子1:
4二、分析
-
首先我們可能會想到從最后一天吃的巧克力的數量來往前反推第一天吃巧克力的數量,但是我們并沒有一個合適的值來進行反推,所以直接pass掉
-
那么我們就只能在第一天下手,我們就 枚舉第一天所有可能吃掉的巧克力的數量,然后根據每個數量計算N天一共吃掉的巧克力的數量和M塊巧克力的數量進行比較。
-
如果從[1....M]逐個進行枚舉,那么肯定是可以的,但是效率比較低,那么什么方法適合這種枚舉的場景呢----->二分查找二分查找詳解
-
舉例:
三、代碼
#include<iostream> using namespace std;//n代表天數,m代表巧克力的數量 int n, m;//函數用來求第一天吃mid塊巧克力,根據題意N天共吃掉巧克力的數量 int sum(int &mid) {int tmp = mid;int total = tmp;for (int i = 0; i < n -1; ++i){tmp = (tmp + 1) / 2;total += tmp;}return total; }int fun() {int l = 1;int r = m;while (l <= r){int mid = (l + r + 1) / 2;int bool_int = sum(mid);if (bool_int == m){return mid;}else if (bool_int < m){l = mid + 1;}else{r = mid - 1;}}return r;} int main() {cin >> n >> m;cout << fun() << endl;return 0; }總結
以上是生活随笔為你收集整理的腾讯----贪吃的小Q的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell编程之文本处理工具awk
- 下一篇: 腾讯----小Q的歌单