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

posted @ 2022-09-19 12:35  白缺  阅读(108)  评论(0编辑  收藏  举报