题目链接:
http://ac.jobdu.com/problem.php?pid=1550
题意:
一队小朋友排队领糖果,相邻的两人分数高的糖果拿的多一点,分数一样的不做要求。求最少需要多少糖果。
思路:
思路挺难想,但是容易理解:
数组a为每个小朋友的分数,数组b为小朋友分得的糖果,当第i个小朋友分数高于第i + 1个小朋友且第i个小朋友分得的糖果少于或等于第i + 1个小朋友(a[i] > a[i + 1] && b[i] <=b[i + 1])时,就将糖果数更新,前后各扫一遍。
AC代码:
#include<cstdio>
#include<cstring>
const int M = 100010;
int a[M], b[M], n;
main()
{
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
b[i] = 1;
}
for(int i = 1; i < n; i++)
if(a[i] > a[i - 1] && b[i] <= b[i - 1])
b[i] = b[i - 1] + 1;
for(int i = n - 1; i > 0; i--)
if(a[i - 1] > a[i] && b[i - 1] <= b[i])
b[i - 1] = b[i] + 1;
int sum = 0;
for(int i = 0; i < n; i++)
sum += b[i];
printf("%d\n", sum);
}
}