有趣的 “切蛋糕“ 问题

  1. 一堆蛋糕大小固定。一群人食量固定。蛋糕可分不可合。求蛋糕最多可以满足多少人。

  2. 在这个里面有一个比较容易知道和推导的关键点,在满足最多食客的组合中,一定有一个从最左边开始的连续的组合。

  3. 二分查找来搜索最右边界。

  4. 代码如下:

  5. #include
    #include
    #include
    #include
    using namespace std;
    bool canFeed(vector &cakes, vector dinner, int number)
    {
    if (number < 0)
    {
    return true;
    }
    int num = 0;
    for (num = 0; num < cakes.size(); num++)
    {
    if (cakes[num] >= dinner[number])
    {
    cakes[num] = cakes[num] - dinner[number];
    return canFeed(cakes, dinner, number - 1);
    }
    }
    if (num == cakes.size())
    {
    return false;
    }
    }
    int cutTheCakes(vector cakes, vector dinner)
    {
    sort(cakes.begin(), cakes.end());
    sort(dinner.begin(), dinner.end());
    int left = 0;
    int right = dinner.size()-1;
    int mid = (left + right) / 2;
    while (left <= right)
    {
    vector cakestemp(cakes);
    if (canFeed(cakestemp, dinner, mid))
    {
    left = mid + 1;
    }
    else
    {
    right = mid - 1;
    }
    mid = (left + right) / 2;
    }
    return mid+1;//由于mid是位置,需要加一返回。
    }
    int main()
    {

    vector cakes{ 5,17,25,3,15 };
    vector dinner{ 2,5,7,9,12,14,20 };
    cout << cutTheCakes(cakes, dinner) << endl;
    system(“pause”);
    return 0;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值