贪吃的小Q

贪吃的小Q

http://www.nowcoder.com/questionTerminal/d732267e73ce4918b61d9e3d0ddd9182

先占个位置,详细思路之后再写;

先贴个图片和源码上去:

图片说明

#include <iostream>
using namespace std;

int first_day_food(int day, int food) {
    if (day <= 0 || day > food) return 0;
    else {
        int times = 0, remain = food;
        if (day < 31)
            // 如果天数大于30天,那么食物绝对不会多(否则食物数量会超出int的上限)
            times = food / ((1<<day)-1), remain = food % ((1<<day)-1);

        if (times > 0)
            // 食物太多了:
            return times*(1<<(day-1)) + first_day_food(day, remain);
        else {
            int d = 0;
            // 食物不够多:
            // 找出本趟可以吃的最大数量:2^d + 2^(d-1) + ... + 2 + 1 + ( ... + 1)
            for (; (1<<d)-1+day-d <= food; d++); d--;
            // 递归计算下一趟分配的食物,并将第一天累加:
            return (1<<(d-1)) + first_day_food(d, food-((1<<d)-1+day-d) );
        }
    }
}

int main() {
    int day, food;
    cin >> day >> food;
    cout << first_day_food(day, food);
    return 0;
}
全部评论

相关推荐

用友 大财务领域产品经理 35w 硕士985
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务