CodeForces 831A Unimodal Array

本文介绍了一种检查数组是否为单峰数组的方法。单峰数组的特点是先严格递增,然后可包含若干相同元素,最后严格递减。文章通过示例说明了单峰数组的概念,并提供了一个简单的C++程序实现来验证数组是否符合单峰特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

转载于:https://www.cnblogs.com/FTA-Macro/p/7270703.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值