分糖果c++实现

#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Fen {

    public:int fen1(){
       /*获取应该准备的最少糖果数:
        两个条件:1、所有人都分到糖果,2、相邻的人得分高的糖果多;
            得分     3 5 4 4 4 5 6 6 6 5 2 3 3 2 1
            糖果数   1 2 1 1 1 2 3 1 3 2 1 2 3 2 1。
        算法思想:主要用到分类讨论思想
        默认第一个人分得1个糖果,后面得分若连续升从2累加,若连续降从2累加,若平+1
        有两种情况需要回滚 1、升多降少需减去降的次数 2、升少降多需减去升的次数
        如1 2 3 4 2 1 升3降2需减2,    如1 2 4 3 2 1 升2降3需减2
        末尾如果是降也需回滚上面两种情况
         升多降少举例1:得分  1 2 3 4 2 1
            实际糖果数:      1 2 3 4 2 1
            算法糖果数:sum   1+2+3+4+2+3
                  回滚:               -2

         升少降多举例1:得分  1 2 4 3 2 1
            实际糖果数:      1 2 4 3 2 1
            算法糖果数:sum   1+2+3+2+3+4
                  回滚:               -2

         */
        //获取数组,用do,while循环
        cout<<"输入一个得分数组:"<<endl;
        vector<int> v;
        int m=0;
        do{
            cin>>m;
            v.push_back(m);
        }while(getchar()!='\n');

        int i,j; 
        int sum=1; //初始化糖果数
        int up=2;  //上升
        int down=2;   //下降
        int up1=2; //上升结束时记下up值用于比较升降次数大小
        int len=v.size();
        int mowei=0;

        for(i=1;i<len;i++){
            if(i==len-1){
                mowei=1;
            }
            if(v[i]==v[i-1]){ //和前一个相比相等
                if(up1>2&&down>2){
                    if(up1<down){  //升少降多,减去升的次数
                        sum-=(up1-2);
                    }else{          //升多降少,将去降的次数
                        sum-=(down-2);
                    }
                    up1=2;
                }
                sum++;
                up=2;
                down=2;
                cout<<"平"<<sum<<" ";

                
            }

            if(v[i]>v[i-1]){ //升
                if(down!=2){      //从降过来
                    sum+=2;

                    if(up1>2&&down>2){
                        if(up1<down){  //升少降多,减去升的次数
                            sum-=(up1-2);
                        }else{          //升多降少,减去降的次数
                            sum-=(down-2);
                        }
                        up1=2;
                    }
                }

                if(up!=2){  //从升过来
                    sum+=up;
                }
                if(down==2&&up==2){   //i==1或从等过来i!=1
                    sum+=2;
                }
                down=2;
                up++;
                cout<<"升"<<sum<<" ";
            }
            
            
            if(v[i]<v[i-1]){ //降
                if(down!=2){      //从降过来
                    sum+=down;
                    if(mowei&&up1>2){
                        if(up1<down+1){  //升少降多,减去升的次数
                            sum-=(up1-2);
                        }else{          //升多降少,将去降的次数
                            sum-=(down-1);
                        }
                    }
                }
                if(up!=2){       //从升过来
                    up1=up;
                    sum+=2;
                    if(mowei){ //升多降少且只降了一个
                        sum-=1;
                    }
                }
                if(down==2&&up==2){   //i==1或从等过来i!=1
                    sum+=2;
                }
                up=2;
                down++;
                cout<<"降"<<sum<<" ";
            }

        }

        cout<<"最低糖果数为:"<<sum<<endl;
        return 0;
       }

};

int main(){
    Fen f;
    f.fen1();
    system("pause");
    return 0;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值