• LeetCode-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) {
            if(ratings.size()==0)return 0;
            if(ratings.size()==1)return 1;
            if(ratings.size()==2){
                if(ratings[0]==ratings[1])return 2;
                else return 3;
            }
            vector<int> ca;
            ca.resize(ratings.size(),-1);
            bool up;
            int start;
            int i=0;
            if(ratings[i]<=ratings[i+1]){
                ca[i]=1;
                up=true;
            }
            else{
                up=false;
                start=i;
            }
            i++;
            while(true){
                if(up){
                    if(ratings[i]<=ratings[i-1]){
                        up=false;
                        if(ratings[i]==ratings[i-1])start=i;
                        else start=i-1;
                        if(i==ratings.size()-1){
                            ca[i]=1;
                            for(int j=i-1;j>=start;j--)ca[j]=max(ca[j],ca[j+1]+1);
                        }
                    }
                    else{
                        ca[i]=max(ca[i],ca[i-1]+1);
                    }
                }
                else{
                    if(ratings[i]>=ratings[i-1]){
                        up=true;
                        ca[i-1]=1;
                        for(int j=i-2;j>=start;j--)ca[j]=max(ca[j],ca[j+1]+1);
                        if(ratings[i]==ratings[i-1]){
                            if(i+1<ratings.size()){
                                if(ratings[i+1]>=ratings[i]){
                                    up=true;
                                    ca[i]=1;
                                }
                                else{
                                    up=false;
                                    start=i;
                                }
                            }
                            else{
                                ca[i]=1;
                            }
                        }
                        else{
                            up=true;
                            ca[i]=2;
                        }
                    }
                    else{
                        if(i==ratings.size()-1){
                            ca[i]=1;
                            for(int j=i-1;j>=start;j--)ca[j]=max(ca[j],ca[j+1]+1);
                        }
                    }
                }
                i++;
                if(i==ratings.size())break;
            }
            int sum=0;
            for(int i=0;i<ratings.size();i++){
                sum+=ca[i];
            }
            return sum;
        }
    };
    View Code
  • 相关阅读:
    点分治 / 点分树题目集
    HNOI2019 游记
    WC2019 题目集
    SA / SAM 题目集
    Min_25 筛小结
    NOIP2018 差点退役记
    Atcoder 乱做
    DP及其优化
    计数与概率期望小结
    分库分表之后全局id咋生成?
  • 原文地址:https://www.cnblogs.com/superzrx/p/3358285.html
Copyright © 2020-2023  润新知