贪心算法:
Assign Cookies 分配器:
题目: 有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。 每个孩子只能吃一个饼干,且只有饼干的大小不小于孩子的饥饿度时,这个孩子才能吃饱。
求解最多有多少孩子可以吃饱。
思考: 一个孩子只能吃一个,饼干大小 >= 饥饿度时候才可以吃饱。
Input:
饥饿度:[1,2]
饼干大小:[1,2,3]
Outpu:
2
运算结果来看是不提供饼干复用,也就是说,大小为3的饼干只会给一个小朋友食用,而并非[1,1,1]可以食用一个饼干。
排序,孩子满足自增,饼干每次都要自增. 排序后孩子饥饿度是从小到大,如果饼干不满足孩子,也意味着一定不会满足下一个孩子,所以每次饼干都要自增.
扩展思考:
**真实的业务中估计没有这种,产品和原则也不会同意资源浪费哈哈,给自己提个需求,本着秉持节约原则,如果饼干可以共食呢?**
改变游戏规则:
- 三个孩子的饥饿是1,1,1,大小为3的饼干可以让三个孩子吃饱。
- 孩子饥饿为2,3, 大小如果为4,被这个孩子吃过后还剩2,下个孩子的饥饿程度为3,那么浪费2。
浪费的饼干累加需要让后面命中的孩子也吃饱,总之不可以浪费饼干。
解题: 可以饥饿相加,比较饼干大小相加,如果总数饼干大小>饥饿则全部满足,但是这样会浪费一次累加计算. 有序sort需要加一些业务条件,原来的条件是<=,则现在区分条件 == 和 < 做临时变量差值匹配.
代码:
#include <iostream>
#include <vector>
#include <algorithm>
int findContentChildren1(std::vector<int>& children, std::vector<int>& cookies)
{
std::sort(children.begin(), children.end());
std::sort(cookies.begin(), cookies.end());
int child = 0, cookie = 0;
// 累计浪费了多少饼干大小
int food = 0;
while (child < children.size() && cookie < cookies.size())
{
do {
if (food)
{
// 浪费饼干+一个饼干,大于孩子饥饿
if (children[child] < (food + cookies[cookie]))
{
food = (food + cookies[cookie]) - children[child];
break;
}
// 浪费饼干+一个饼干,抵消一个孩子饥饿
else if (children[child] == (food + cookies[cookie]))
break;
}
// 如果饥饿和饼干大小相等,抵消
if (children[child] == cookies[cookie])
break;
// 如果饥饿小于饼干大小,求差_累加
else if (children[child] < cookies[cookie])
{
// 这里food已经有了浪费饼干积累
food += cookies[cookie] - children[child];
}
// food + 一个饼干满足不了孩子的饥饿
else
{
// 因为while出去child++,所以这里先--, 相当于孩子不变
child--;
food += cookies[cookie];
}
} while (false);
child++;
cookie++;
}
// 已经知道有几个孩子已经吃饱,需要判断food是否有存粮(饼干)
while (child < children.size())
{
//
(food > children[child]) ? (food -= children[child]) : (food = 0);
if (food == 0)
break;
child++;
}
return child;
}
int main(void)
{
std::vector<int> children = { 1,1,0,3,3,2,2 };
std::vector<int> cookies = { 0,0,0,10,1,2 };
findContentChildren1(children, cookies);
}
LeetCode Github See 2.2:https://github.com/changgyhub/leetcode_101/