假设有多个孩子,数组 g 保存所有孩子的胃口值。有多块饼干,数组 s 保存所有饼干的尺寸。小杨给孩子们发饼干,每个孩子最多只能给一块饼干。饼干的尺寸大于等于孩子的胃口时,孩子才能得到满足。小杨的目标是尽可能满足越多数目的孩子,因此打算采用贪心算法来找出能满足的孩子的数目,则横线上应填写的代码为( )。
int cooki4children(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int index = s.size() - 1; // 饼干数组下标
int result = 0;
for (int i = g.size() - 1; i >= 0; i--) {
if (index >= 0 && s[index] >= g[i]) {
________________________ // 在此处填入代码
}
}
return result;
}根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】贪心算法|数组遍历|vector(标准容器)
看到题先想:目标函数是最大化满足人数,约束是饼干尺寸≥胃口。贪心策略的核心在于局部最优能导向全局最优。排序后从后往前遍历,这是经典的两指针贪心框架,比正序遍历更直观地体现“大饼干配大孩子”的直觉。
逐个选项拆解:A 正确——匹配成功时,孩子数 +1,饼干指针 -1。B 减了 count 显然错。C 饼干指针 +1 会越界或重复用。D 指针 +1 同样越界。陷阱在于“饼干用掉就不能再给其他孩子”,指针必须同步递减,否则逻辑崩。C 中 index++ 会尝试使用更大的饼干,但当前已遍历过所有更大的饼干,必然越界或重复使用。D 同样如此。
反命题视角:若改题成“尽量满足胃口最小的孩子”,循环从 i=0 开始,index 从 0 开始,逻辑完全对称。遇到“饼干尺寸严格大于胃口”这类细节,条件判断和指针移动都要微调,但核心贪心思想不变。若将条件改为“饼干尺寸严格大于胃口”,则判断条件变为 s[index] > g[i],逻辑不变。若允许一个饼干喂多个孩子,则需改变数据结构为计数或优先队列,本题的贪心框架就不成立了。