class Solution {
public:
int candy(vector<int>& ratings) {
int num = ratings.size();
int sum = 0;
vector<int> c; //c存取每个位置应该分发的糖果数
int k,temp ;
if (num == 0) return 0;
if (num == 1) return 1;
//学生 >1 人
for (int i = 0, j = 0; i < num-1; i++)
{
//向前看
if (i>0&&ratings[i] > ratings[i - 1]) k++;
else k = 1;
//向后看(判断有几个无需自增)
j = i + 1;
if (ratings[j - 1] > ratings[j] && k > 1)//已经大于左边,右边连续递减k-1时,k无需自增,多于k-1时,k需要开始自增
{
int m = j - 1;
for (; m <num && m < j + k - 1; m++)
{
if (m+1>=num||ratings[m] <= ratings[m + 1]) break;//在向后看k-1个数过程中,控制条件为连续自减,出现后一个数大于等于前一个数时k无需再自增
}
if(m==j+k-1)j = m;//特别注意这里,如果k-1个数都满足条件,则是因为m>=j+k-1才跳出的循环,m=j+k-1;
else j =m +1;//在if时就跳出了循环,m需要+1,走到第一个大于前面相邻数的位置
}
//向后看
while (j<num&&ratings[j - 1] > ratings[j]) {
k++;
j++;
}
c.push_back(k);
//cout <<i<<" "<< ratings[i] << " : " << k << endl;
}
//最后一个位置糖果的设置
if (ratings[num - 1] <= ratings[num - 2]) c.push_back(1);
else c.push_back(k + 1);
for (int i = 0; i < num; i++) sum += c[i];
return sum;
}
};