贪心算法
Assign Cookies (Easy)
有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃
最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩
子可以吃饱。
解析:将孩子所需和饼干大小从小到大排序,然后逐一进行比较。
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdio.h>
using namespace std;
vector<int> children = { 1,2,4,8,10 };
vector<int> cookies = {1, 2, 3,3,3,9,9};
unsigned int findContentChilderen(vector<int>& children, vector<int>& cookies)
{
sort(children.begin(), children.end());
sort(cookies.begin(), cookies.end());
unsigned int chil = 0;
unsigned int cook = 0;
while (chil < children.size() && cook < cookies.size())
{
if (children[chil] <= cookies[cook]) ++chil;
++cook;
}
return chil;
}
void main()
{
unsigned int num = findContentChilderen(children, cookies);
cout << num << endl;
}
Candy (Hard)
一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一
个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所
有孩子至少要有一个糖果。求解最少需要多少个糖果。
解析:初始化每个孩子的糖果数为1,然后从左往右进行遍历比较,再从右到左进行遍历比较,可以得到最终的糖果总数。
#include<vector>
#include<numeric>
#include<algorithm>
#include<iostream>
using namespace std;
int candy(vector<int> &ratings)
{ //入口检查
int size = ratings.size();
if (size < 2)
{
return size;
}
//初始化数组
vector<int> num(size, 1);
for (int i = 1; i < size; ++i)
{
if (ratings[i] > ratings[i - 1] + 1)
{
num[i] = num[i - 1] + 1;
}
}
for (int i = size - 1; i > 0; --i)
{
if (ratings[i] < ratings[i - 1])
{
num[i - 1] = max(num[i - 1], num[i] + 1);
}
}
return accumulate(num.begin(), num.end(), 0);
}
int main()
{
vector<int> cookies1 = { 1, 0, 2};
int cookes_num = candy(cookies1);
cout << cookes_num << endl;
}