题目大意
给出一个长度为n的序列,用次数最少的划分,使得每部分单调不升或单调不降。
求这个次数。
输入
9
1 2 1 2 1 2 1 2 1
输出
5
解
从第一个数开始,判断数字的趋势。趋势相同的划分到同一个部分,如不同,则划分到下一个部分。
代码
#include<cstdio>
//ud:0代表未知趋势,1代表上升,2代表向下
int n,ans,ud,k[5];
int main(){
scanf("%d", &n);
scanf("%d", &k[1]);
ud = 0; ans = 1;
for(int i = 2; i <= n; ++i){
scanf("%d", &k[i%2]);
if(ud == 0){
//还显示出趋势
if(k[i%2] > k[(i-1)%2]) ud = 1; //如果当前数给了当前部分一个趋势
else if(k[i%2] < k[(i-1)%2]) ud = 2;
}
else if(ud == 1 && k[i%2] < k[(i-1)%2]){
//上升趋势断开
++ans; //重置,累计答案
ud = 0;
}
else if(ud == 2 && k[i%2] > k[(i-1)%2]){
//下降趋势断开
++ans; //重置,累计答案
ud = 0;
}
}
printf("%d",ans);
}