-
一堆蛋糕大小固定。一群人食量固定。蛋糕可分不可合。求蛋糕最多可以满足多少人。
-
在这个里面有一个比较容易知道和推导的关键点,在满足最多食客的组合中,一定有一个从最左边开始的连续的组合。
-
二分查找来搜索最右边界。
-
代码如下:
-
#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;
}
有趣的 “切蛋糕“ 问题
最新推荐文章于 2021-04-17 21:01:58 发布