candyforkids

题目:

  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 ;
}

点赞