Array of integers is unimodal, if:
- it is strictly increasing in the beginning;
- after that it is constant;
- after that it is strictly decreasing.
The first block (increasing) and the last block (decreasing) may be absent. It is allowed that both of this blocks are absent.
For example, the following three arrays are unimodal: [5,?7,?11,?11,?2,?1], [4,?4,?2], [7], but the following three are not unimodal: [5,?5,?6,?6,?1], [1,?2,?1,?2], [4,?5,?5,?6].
Write a program that checks if an array is unimodal.
Input
The first line contains integer n (1?≤?n?≤?100) — the number of elements in the array.
The second line contains n integers a1,?a2,?...,?an (1?≤?ai?≤?1?000) — the elements of the array.
Output
Print "YES" if the given array is unimodal. Otherwise, print "NO".
You can output each letter in any case (upper or lower).
Example
Input
6 1 5 5 5 4 2
Output
YES
Input
5 10 20 30 20 10
Output
YES
Input
4 1 2 1 2
Output
NO
Input
7 3 3 3 3 3 3 3
Output
YES
Note
In the first example the array is unimodal, because it is strictly increasing in the beginning (from position 1 to position 2, inclusively), that it is constant (from position 2 to position 4, inclusively) and then it is strictly decreasing (from position 4 to position 6, inclusively).
题目大意:给你一串数字问是不是unimodal(单峰的)。所谓unimodal就是数列前半部分严格单增,接下来是连续相等的数字,后面部分是严格单减的。例如 [5,?7,?11,?11,?2,?1]中[5,7,11]单增,[11,11]连续相等,[11,2,1]单减。
大致思路:开个数组,按照给出的条件简单模拟一下。先判断递增,模拟成功,计数器+1,不成功直接到下一个循环判断是否连续相等,不成功再跳到最后一个判断条件。如果是unimodal,那么会发现计数器会大于给出数组大小,详见代码。
#include<iostream> #include<cstdio> #include<cstring> #define maxn 105 using namespace std; int a[maxn]; int main() { int i,n; while(scanf("%d",&n)==1) { memset(a,0,sizeof(a));//因为1=<a[i]<=1000,所以初始化可以直接用0 for(i=0;i<n;i++) cin>>a[i]; int p=1; while(a[p]>a[p-1])//顺序要对 p++; while(a[p]==a[p-1]) p++; while(a[p]<a[p-1]) p++; if(p>n)//这里p只可能大于n或小于n cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }