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