Candy(Hard)
题目描述:
一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所
有孩子至少要有一个糖果。求解最少需要多少个糖果。
输入输出样例:
>> [1, 0, 2]
>> 5
也就是说最少需要5个糖果。
算法逻辑
其实就是一个贪心算法的题。我们只需遍历两遍就可以了:
第一遍比较i元素和i+1元素的大小关系,若a[i] > a[i+1],就更新给ta的糖果数量:糖果数量[i] = max(糖果数量[i], 糖果数量[i+1]+1). 毕竟我是要满足题意的。此时我们就完成了一半——即在条件i和i+1时有满足题意。
代码
//#include<iostream>
//#include<vector>
//#include<numeric>
#include<bits/stdc++.h>
using namespace std;
int child[1000];
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])
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> vec;
int n = 0, num = 0;
cout << "孩子总数:";
cin >> n;
cout << "每个孩子的评分:" << endl;
for(int i = 0; i < n; i++){
cin >> num;
vec.push_back(num);
}
cout << "共需要的苹果数量:" << candy(vec) << endl;
// cout << "每个人应得的苹果:" << endl;
// for(int i = 0; i < n; i++)
// cout << child[i] << " ";
// cout << endl;
return 0;
}