题目
假设N个小孩站成一排,每个小孩被分配了一个整数号码。要按照如下的要求给孩子们发糖。
1、每个小孩至少有一颗糖果
2、号码大的孩子比相邻的孩子分到的糖果要多
求最少要发出几颗糖果
输入
0 1 3 1 4
输出
9
分析
可以前后循环两遍,第一遍从前往后,把相邻的两个小孩中,前面号码比后面号码大的多发糖;第二遍从后往前,同样把相邻孩子中,后面号码比前面号码大的多发糖;最后加和得到结果。
代码
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int main()
{
vector<int> ratings;
int tmp;
while (cin >> tmp)
ratings.push_back(tmp);
const int n = ratings.size();
vector<int> increment(n);
for (int i = 1, inc = 1; i < n; i++)
{
if (ratings[i] > ratings[i - 1])
increment[i] = max(inc++, increment[i]);
else
inc = 1;
}
for (int i = n - 2, inc = 1; i >= 0; i--)
{
if (ratings[i] > ratings[i + 1])
increment[i] = max(inc++, increment[i]);
else
inc = 1;
}
cout << accumulate(increment.begin(), increment.end(), n);
return 0;
}
时间: 2024-10-30 06:16:05