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?

题目挺复杂的,要完全理解题意,详见注释

class Solution {
public:
    int candy(vector<int> &ratings) {
        const unsigned int lens=ratings.size();
        int* dp=new int[lens];
        memset(dp,0,lens*sizeof(*dp));  //初始化为0,dp代表第i个人拿的糖果数
        dp[0]=1;
        int min=1;
        for(int i=1;i<lens;++i)
            {
            if(ratings[i]>ratings[i-1])  //如果后一个大于前一个,此人拿的糖果数一定是前一个加1;
                dp[i]=1+dp[i-1];
            else if(ratings[i]==ratings[i-1])//如果后一个等于前一个,此人要拿最少的糖果数也就是   
                                             //个.以为只要保证概率大的比邻居的糖果多就像,
                                             //相等的话肯定只给一个就好.
            {
                dp[i]=1;
            }
            else                             //如果小于分两种情况
                {
                if(dp[i-1]>1)                //前一个如果大于1,那么只要给其一个糖果
                    dp[i]=1;
                else
                    {
                    dp[i]=1;                //否则给其一个糖果,并且前面的也要多给一个
                    int j=i-1;
                    for(;j>=1;--j)
                        {
                        dp[j]=dp[j]+1;
                        if(ratings[j]>=ratings[j-1]||dp[j]<dp[j-1]) //直到给的那个人的概率比前一个人大,相等,或者虽然这个人概率比前一个小,但是得到的糖果也比前一个小.
                            break;
                    }
                    if(j==0&&ratings[1]<ratings[0]&&dp[1]>=dp[0]) //判断最开始两个,也是上面相同的判断条件.
                        ++dp[0];
                }

            }
        }
        int count=0;
        for(int i=0;i<lens;++i)
            {
            count+=dp[i];
        }
        delete[] dp;
        return count;
    }
};

标准答案,从左向右扫描一遍,再从右向左扫描一遍,聪明的人还是多啊

class Solution {
public:    int candy(vector<int> &ratings) {        
    //题意:N个孩子站成一排,每个孩子分配一个分值。给这些孩子派发糖果,满足如下要求:        
    //每个孩子至少一个        
    //分值更高的孩子比他的相邻位的孩子获得更多的糖果        
    //求至少分发多少糖果?        
    int len=ratings.size();        
    if(len==1) return 1;                 
    int sum=0;        
    vector<int> v(len,1);//初始将每个孩子的糖果数都设为1                 
    //从左向右扫描,保证一个方向上分数更大的糖果更多        
    for(int i=1;i<len;i++){            
        if(ratings[i] > ratings[i-1])                
            v[i]=v[i-1]+1;       
    }        
    //从右向左扫描,保证另一个方向上分数更大的糖果更多       
    for(int i=len-2;i>=0;i--){            
        if(ratings[i] > ratings[i+1] && v[i] <= v[i+1])                
            v[i]=v[i+1]+1;        
    }                 
    for(int i=0;i<len;i++){            
        sum+=v[i];        
    }        
    return sum;    
}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值