题目:
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
思路:
比如有10个孩子,rate分别为,6,5,6,9,8,1,9 ,4 ,8,5
1.从头到尾遍历一遍rate,保证相邻的孩子之间,如果kidRate[i+1]>kidRate[i],kidCandy[i+1] = kidCandy[i]+1,kidCandy[i+1] = 1 否则。初始化的时候kidCandy[0 = 1 。上面给出的rate第一遍遍历后每个孩子的candy为1,1,2,3,1,1,2,1,2,1
2.从头尾到头遍历一遍rate,保证相邻的孩子之间,如果kidRate[i]>kidRate[i+1],kidCandy[i] = kidCandy[i+1]+1。上面给出的rate这次遍历后每个孩子的candy为2,1,2,3,2,1,2,1,2,1。
3.根据第二次的结果,计算出最小的candy数为17。
代码:
#define NUM_KIDS 10
#define MAX( X ,Y ) ( (X) > (Y) ? (X) : (Y) )
int minimumCandy( int nKids , int kidRate[] , int kidCandy[] )
{
int i = 0 ;
int totalCandy = 0 ;
kidCandy[0] = 1 ;
int cur = 0 ;
for( i = 1 ; i < nKids ; i++ )
{
if( kidRate[i] > kidRate[i-1] )
kidCandy[i] = kidCandy[i-1]+1 ;
else
kidCandy[i] = 1 ;
}
totalCandy = kidCandy[nKids-1] ;
for( i = nKids-2 ; i >= 0 ; i– )
{
cur = 1 ;
if( kidRate[i] > kidRate[i+1] )
{
cur = kidCandy[i+1]+1 ;
}
else if( kidRate[i] == kidRate[i+1])
{
cur = kidCandy[i+1] ;
}
totalCandy += MAX( cur ,kidCandy[i] ) ;
if( cur > kidCandy[i] )
kidCandy[i] = cur ;
}
return totalCandy ;
}