Problem P17. [算法课贪婪]分发饼干
力扣也有这道题,但是力扣做的很快,碰到有输入输出的题目就感觉我在做两道题目,一道是如何输入两行,每行是一个不定长的数组元素,最后在代码中转为数组,c++不好做,c的话可能就更难了。另一道是贪心的题目,这里有个很重要的,就是每个孩子只能吃一个饼干,那么就只需要先将两个数组排序,从胃口最小的孩子开始,让每个孩子都有满足他的饼干就好。因为:现在最小的饼干可以满足一个胃口小的孩子和一个胃口大的孩子,那么给胃口小的孩子是不会错的,给胃口大的也可以,但是有可能胃口大的胃口更大,满足不了它。总而言之,把小的饼干给胃口小的孩子,如果是可以满足他的,情况至少是多满足了一个,结果不会更差,但是给了大的孩子可能满足不了他,结果可能更差。
我说的也不好,贪心就是选择那个反正无论如何结果不会更差的情况,类似局部最优解。
#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>
#include<string>
using namespace std;
int toInt(string str){
stringstream stream;
int n;
stream << str;
stream >> n;
return n;
}
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int gpointer = 0, spointer = 0;
int num = 0;
// 每个孩子最多只能给一块饼干
while(gpointer < g.size() && spointer < s.size()){
if (s[spointer] >= g[gpointer]){
num++;
gpointer++;
}
spointer++;
}
return num;
}
int split(string str, vector<int>& result){
string s = "";
for (int i = 0; i < str.length(); i++){
if (str[i] != ' '){
s += str[i];
}else {
result.push_back(toInt(s));
s = "";
}
}
if (s.length()>0){
result.push_back(toInt(s));
}
return 1;
}
int main()
{
string child;
getline(cin, child);
vector<int> childs;
split(child, childs);
string cookie;
getline(cin, cookie);
vector<int> cookies;
split(cookie, cookies);
int num = findContentChildren(childs, cookies);
cout << num;
return 0;
}
分类:
数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通