码迷,mamicode.com
首页 > 其他好文 > 详细

Candy

时间:2014-05-22 11:00:49      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   c   code   color   

Problem:Candy

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?

思路:遍历两次,首先从左往右,只看左边的邻居,满足条件:如果ratings[i] > ratings[i-1],则candy_num_1[i] > candy_num_1[i-1]。然后从右往左,只看右边的邻居,满足条件:如果ratings[i] > ratings[i+1],则candy_num_2[i] > candy_num_2[i+1]然后取两个数组中每个孩子分得的糖果数的较大值,则每个孩子所拥有的糖果数,既对其左邻居满足条件,又对其右邻居满足条件,且能保证分得的糖果总数最少。

class Solution {
public:
    int candy(vector<int> &ratings) {
        int n = ratings.size();
        if(n == 0 || n == 1)
            return n;
        int sum = 0;//保存最少糖果的总数
        int candy_num[n];
        int cur_candy = 1;
        int i = 0;
        while(i < n)//初始化数组,每人至少分配一颗
        {
            candy_num[i] = 1;
            i++;
        }
        for(i = 1; i < n; i++)//从左往右遍历
        {
            if(ratings[i] > ratings[i-1])
                candy_num[i] = candy_num[i-1] + 1;
        }
        sum = candy_num[n-1];
        for(i = n-2; i > -1; i--)//从右往左遍历
        {
            if(ratings[i] > ratings[i+1])
            {
                cur_candy++;
                sum += max(cur_candy, candy_num[i]);
            }
            else
            {
                cur_candy = 1;
                sum += candy_num[i];
            }
        }
        return sum;
    }
    int max(int a, int b)
    {
        return a>b?a:b;
    }
};

Candy,布布扣,bubuko.com

Candy

标签:style   blog   class   c   code   color   

原文地址:http://blog.csdn.net/wan_hust/article/details/26226277

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!