一.题目
二.解题思路
本题依次比较整个数组
2. a[i+1]>a[i] ,则进入非递减序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位
置的判断
3. a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位
置的判断
4. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减
序列。
本题注意点:本题开始比较a[i+1]与a[i]进行比较,为了避免越界,数组定义为n+1个,同时给a[n] = 0;
a[n] = 0带来的影响,我们分为三种情况讨论:
1. 若到a[n-1] 的最后一组是非递减序列,当i==n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入
条件已经说明了(去看看题目输入条件描述),里面的循环结束,i++,count++,i==n,外面的循环结束。
2. 若到a[n-1] 的最后一组是非递增序列,当i==n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入
条件已经说明了(去看看题目输入条件描述),循环再走一次,i++, i== n,里面的循环结束,i++,
count++,i==n+1,外面的循环结束。
3. 第三种情况 1 2 1 2 1最后一个数是单独的情况,后面补个0,序列变成1 2 1 2 1 0,当走完全面的序列
i==n-1时,a[i] > a[i+1],进入判断出一个非递增序列,count++,i++,循环结束。
4. 也就是说数组最后一个位置多增加一个0,不会影响第1、2情况的判断,主要是帮助第3情况的正确判
断。
三.代码如下
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int>a;
a.resize(n+1);
a[n]=0;
int i=0;
for(i=0;i<n;i++)
{
cin>>a[i]; //读入数据
}
i=0;
int count=0;
while(i<n)
{
if(a[i]<a[i+1]) //非递减数组
{
while(i<n&&a[i]<=a[i+1])
i++;
count++;
i++;
}
else if(a[i]==a[i+1])
{
i++;
}
else{
while (a[i]>=a[i+1]) //非递增数组
i++;
count++;
i++;
}
}
cout<<count<<endl;
return 0;
}