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;
}