饼干和鲜花

作者在忙碌的工作之余,寻找时间培养个人爱好。面对工作中的挑战,如将Java代码转换为C++,以及对摄影的热情,他尝试找到工作与个人兴趣之间的平衡。

饼干和鲜花,如果让你选择,你会选择哪样呢?其实答案很显然,因为你没得选,饼干是是你能够维持生存状态去赏鲜花的先决条件。这些日子,我就在这两样抉择中徘徊着。


为了有饼干,我们每日起早摸黑的,甚至还需要无薪加点班的。哪里来的时间去赏花呢。应届毕业生的毕业设计已经到了中期检查,而我的其中一个算法还没有修改完毕,也许这会影响他们的进度,而我最近的工作就是把之前的项目从Java修改成C++。哎,这个都能把握折腾了好多天。时常觉得很烦,因为在做原来重复的工作,可是又有什么法子呢,生活啊,我的饼干就是从里面产出来的。如果我也能像陶渊明不为五斗米折腰(哈哈,我远远没有那么伟大,好像我很物质)的话,我还是需要一亩可以维持生活的土地啊,不然哪有地方采菊东篱下。(玩笑之辞)。突然发现自己属牛的,怎么没有那种任劳任怨的性格呢?反而既想要饼干,还想要鲜花。我的鲜花是什么呢,摄影啦。自从买了相机之后,无不想到处逛逛,练练手感。我想我已经对它十分的感兴趣了,可是又能怎么样呢?连周六我都还在实验室里面写作业呢。好不容易拍了几张,分享一下,纯属兴趣,不谈技术:

看着图片,虽然很多张里面才选出几张见人,可是打心里享受这份喜悦。

没有太多可以抱怨生活得,只是觉得,再累再苦,别把自己当二百五了,要学会放松下,享受下;饼干自然要争取,鲜花我们也不妨欣赏下。

 

饼干和鲜花,我只能选择鲜花,因为只有鲜花可以选。



### 题目分析 分饼干问题旨在通过分配尽可能小的饼干满足尽可能多的孩子。每个孩子有一个胃口值,表示满足该孩子所需饼干的最小尺寸;每块饼干有一个尺寸。目标是找出最多能满足多少个孩子。这是一个典型的资源分配优化问题,需要在给定的饼干尺寸集合孩子胃口值集合之间找到最佳匹配,以最大化满足的孩子数量[^2]。 ### 算法构造 采用贪心算法,核心思想是优先满足胃口小的孩子,因为这样可以用较小的饼干去满足更多的孩子。首先对孩子的胃口值饼干的尺寸进行排序,然后依次尝试用最小的饼干去满足胃口最小的孩子。如果当前饼干能满足当前孩子的胃口,则满足该孩子并继续尝试用下一块饼干满足下一个孩子;如果当前饼干不能满足当前孩子的胃口,则尝试用下一块更大的饼干去满足当前孩子。这种策略保证了在每一步都做出局部最优选择,最终得到全局最优解[^2]。 ### 算法实现 ```java class Solution { public int findContentChildren(int[] g, int[] s) { // 对孩子的胃口值数组进行排序 java.util.Arrays.sort(g); // 对饼干的尺寸数组进行排序 java.util.Arrays.sort(s); // 记录满足的孩子数量 int ans = 0; // 孩子数组的索引 int p1 = 0; // 饼干数组的索引 int p2 = 0; // 遍历饼干数组孩子数组 while (p2 < s.length && p1 < g.length) { // 如果当前饼干能满足当前孩子的胃口 if (g[p1] <= s[p2]) { // 满足的孩子数量加1 ans += 1; // 移动到下一个孩子 p1++; } // 无论是否满足,都移动到下一块饼干 p2++; } return ans; } } ``` ### 代码解释 - `Arrays.sort(g)` `Arrays.sort(s)`:对孩子的胃口值数组 `g` 饼干的尺寸数组 `s` 进行排序,以便后续按顺序进行匹配。 - `ans`:用于记录最终满足的孩子数量。 - `p1` `p2`:分别是孩子数组饼干数组的索引,用于遍历数组。 - `while` 循环:在饼干数组孩子数组都未遍历完的情况下进行匹配。 - `if (g[p1] <= s[p2])`:判断当前饼干是否能满足当前孩子的胃口,如果能满足,则 `ans` 加1,并移动到下一个孩子;无论是否满足,都移动到下一块饼干。 ### 运行结果 假设孩子的胃口值数组 `g = [1, 2, 3]`,饼干的尺寸数组 `s = [1, 1]`。调用 `findContentChildren` 函数,程序将输出能满足的孩子数量。在这个例子中,只能满足一个孩子,所以输出为 `1`。 ### 经验归纳 - 贪心算法在解决分饼干问题时非常有效,关键在于选择合适的贪心策略,即优先满足胃口小的孩子。 - 排序操作是算法的重要步骤,它使得后续的匹配过程能够有序进行,时间复杂度主要取决于排序算法,通常为 $O(n log n)$,其中 $n$ 是孩子或饼干的数量。 - 贪心算法的局部最优选择能保证得到全局最优解,但在应用贪心算法时,需要证明贪心策略的正确性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值