问题:老师发苹果或者饼干的问题,每人至少分一个,相邻的同学分数高的一定比分数低的同学数量多,问至少老师要准备多少数量的苹果或饼干?
如果两个相同分数的人相邻,那么不要求分发数量相等。
我们从两个方向同时进行扫描,如果比前者或者后者大,我们就在之前的基础上+1
int get_apple(vector<int> &vec)
{
int count = 0;
int n = vec.size();
if(n <= 0) return 0;
vector<int> left(n);
vector<int> right(n);
for(int i = 1;i < n;++i)
{
if(vec[i] > vec[i-1])
{
left[i] = left[i-1] + 1;
}
}
for(int i = n-2;i >= 0;--i)
{
if(vec[i] > vec[i+1])
{
right[i] = right[i+1] + 1;
}
}
for(int i = 0;i < n;++i)
{
if(left[i] > right[i])
{
count += left[i];
}
else
{
count += right[i];
}
}
return count + n;
}
图解如下:
for循环:
其中,下角标3中的数据有两个,取其中较大的。
最后就可以得到最少的苹果数目了。