分饼干(华为机试经典贪心真题|Python AC完整代码,牛客可直接提交)
题目描述
假设你是一位很棒的家长,想要给孩子们分饼干。
每个孩子i有一个胃口值g[i],代表这个孩子需要的饼干最小尺寸;
每块饼干j有尺寸s[j]。
如果饼干尺寸s[j] >= g[i],这个孩子可以得到这块饼干。
每个孩子最多只能拿一块饼干,每块饼干只能分给一个孩子。
求最多能满足多少个孩子。
输入描述
第一行:孩子胃口数组,空格分隔
第二行:饼干尺寸数组,空格分隔
输入样例
1 2 3 1 1输出样例
1解释:只能满足胃口为1的孩子
样例2
1 2 1 2 3输出
2✅贪心思路
- 孩子胃口从小到大排序;饼干从小到大排序
- 双指针:小饼干优先喂胃口最小的孩子(局部最优,全局最优)
- 如果当前饼干可以满足当前孩子:计数+1,两个指针都后移;
不满足:这块饼干太小,看下一块饼干,饼干指针后移
完整可提交代码
importsysdefmain():lines=sys.stdin.read().splitlines()# 读取孩子胃口数组g=list(map(int,lines[0].split()))# 读取饼干数组s=list(map(int,lines[1].split()))# 贪心核心:两个数组都升序排序g.sort()s.sort()child=0# 孩子指针cookie=0# 饼干指针count=0# 满足的孩子数量whilechild<len(g)andcookie<len(s):ifs[cookie]>=g[child]:# 当前饼干可以满足这个孩子count+=1child+=1cookie+=1else:# 饼干太小,看下一块饼干cookie+=1print(count)if__name__=="__main__":main()机试重点笔记
- 核心策略:两个数组都升序,小饼干优先喂胃口最小的
- 边界情况(测试时一定要想到)
- 没有孩子 / 没有饼干:输出0
- 所有饼干都太小,满足不了任何人:输出0
- 饼干数量远多于孩子
- 贪心适用原因:优先消耗最小能满足的饼干,把大饼干留给胃口更大的孩子,不会浪费大饼干
做题模板提取(可以背)
g.sort()s.sort()c1=c2=ans=0whilec1<len(g)andc2<len(s):ifs[c2]>=g[c1]:ans+=1c1+=1c2+=1else:c2+=1print(ans)对比区分:
- 分饼干:双数组排序 + 双指针贪心
- 活动选择:单数组,按结束时间排序贪心
- 区间合并:区间数组,按起点排序贪心