贪心法经典题目——孩子分糖

先看题目:

题目描述:

一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果。

这道题用贪心算法来做将变得非常简单

我们只需要简单的两次遍历:先定义一个结构体数组Child,定义孩子的分数及分到的糖果两个变量,把所有孩子的糖果数初始化为 1;首先我们用一个for循环从左往右遍历,如果右边孩子的分数高于左边,那么我们将右边孩子的糖果数改为左边孩子的糖果数加 1;接下来我们用for循环从右往左遍历一遍,如果左边孩子的评分数比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,那么将左边孩子的糖果数改为右边孩子的糖果数加 1。两次遍历后,孩子的糖果数就满足题目要求了。最后再将孩子的糖果数都加起来输出则Ok啦

接下来上代码:

#include
#define NUM 50

using namespace std;

int main(void){
	
	struct Child {
		int score;
		int candy = 1;
	}; 
	Child child[NUM];
	int n = 0,sum = 0;
	cout <<"请输入孩子的人数"<<endl;	
	cin >> n; 
	cout <<"请依次输入孩子的分数"<<endl; 
	for(int i = 0;i < n ;i++){
		cin >> child[i].score ;
	} 
	for(int i = 0; i < n; i++){
		
		if(child[i].score < child[i+1].score) child[i+1].candy = child[i].candy + 1;
	}
	for(int i = n - 1; i >= 0; i--){
		
		if(child[i-1].score > child[i].score) child[i-1].candy = max(child[i-1].candy,child[i].candy+1);

	}
	for(int i = 0; i < n; i++){
		
		sum += child[i].candy;
	}	
	cout<<sum<<endl;
	return 0;
}

有什么问题或者可以改进的请私信我哦~

你可能感兴趣的:(编程,算法,leetcode,c++)