笔试题9——最少分糖果问题

题目描述:你是学校老师,有n个学生,某次考试后,你让n个学生排成一排,按照他们的分数来给予奖励;奖励为发送糖果,每个孩子至少会得到一个糖果;另外如果某个孩子发现他的分数比相邻同学高,但是糖果却不比他们多,便会不开心,你需要用最少的糖果来让所有孩子开心。
输入描述: 第一行 学生数量n 第二行 学生的分数
输出描述: 需要最少的糖果数
示例:
输入
5
80 90 99 80 70
输出
9

核心代码如下:

#include 
#include 
using namespace std;

int main(void){
	int n;
	vector vec;
	vector index;
	cin >> n;
	for(int i = 0; i < n; i++){ //存放学生分数
		int temp;
		cin >> temp;
		vec.push_back(temp);
	}
	for(int i = 0; i < n; i++)  //存放糖果数量,初始化都为1
		index.push_back(1);

	cout << "学生分数为: " << endl;
	for(int i = 0; i < n; i++)
		cout << vec[i] << " ";
	cout << endl;

	for(int i = 1; i < n; i++){
		if(vec[i] > vec[i - 1]) //比左边的分数高
			index[i] = index[i - 1] + 1;
		else if(vec[i] < vec[i - 1]){
			if(index[i] == index[i - 1]){ //比左边的分数低
				index[i - 1]++; //左边孩子糖果加1
				for(int j = i - 1; j > 0; j--){
					if(vec[j - 1] > vec[j] && index[j - 1] == index[j]) //判断左边孩子糖果加1后是否影响到左边孩子的左边
						index[j - 1]++;
				}
			}
		}
	}
	cout << "分糖果后index容器为: " << endl;
	for(int i = 0; i < n; i++)
		cout << index[i] << " ";
	cout << endl;

	int sum = 0;
	for(int i = 0; i < index.size(); i++){
		sum += index[i];
	}
	cout << "最小糖果数为: " << sum << endl;

	return 0;
}

另一种思路:
index容器是每个小朋友得到的糖果数。我们首先从左往右遍历,给index容器赋初值,如果当前小朋友的分数比前1位小朋友的高,则分给当前小朋友的糖果数=前1位小朋友的糖果数+1,否则当前小朋友的糖果数=1(满足每个孩子至少有1颗糖);然后再从右到左遍历,需要再比较当前小朋友和后1位小朋友的分数,但此时,由于我们已经给index容器赋过初值,即如果满足当前小朋友的分数比后一位小朋友高时,当前小朋友的糖果数也比后一位小朋友的糖果数高,则说明原始index容器满足条件;否则需要修改当前小朋友的糖果为后一位小朋友的糖果数+1。

你可能感兴趣的:(笔试题)