Codeforces Round #424 (Div. 2) A Unimodal Array 思维题

来源:互联网 发布:淘宝旺铺有什么好处 编辑:程序博客网 时间:2024/06/05 18:57

CF传送门

题意:

1. 给出一个整数数组,问这个数组是不是单峰数组(即递增,平,递减。只能出现一个向上的波峰或者没有波峰)

2. 可以没有左边的递增,也可以没有右边的递减,也可以没有中间的平峰。总之不能出现多峰,不能出现向下峰即可

3. 4-4-2就是没有左边递增的情况,2-4-4是没有右边递减的情况,3-3-3是平峰情况,单个数字也是平峰,1-2-1是没有平峰情况,这些都是满足单峰数组的

4. 5-5-6-6-7在递增的左边出现平峰或递减都是错误的,1-2-1-2出现两个波峰,4-5-5-6也是两个波峰,这些都是错误的

题解:

1. 找到数组靠左的波峰值和靠右的波峰值(右边这个值要从左值开始搜,避免出错)

2. 然后分别从左值和从右值开始向两边搜索数组,判断是否单调


以下是我的AC代码:

#include <cstdio>using namespace std;const int maxn=100+5;int a[maxn];int main(){    int n,maxnum=0;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        if(maxnum<a[i])      //找到波峰值            maxnum=a[i];    }    int i;    for(i=1;i<=n;i++)        if(a[i]==maxnum)            break;    int tx1=i;               //波峰左值    for(;i<=n;i++)        if(a[i]<maxnum)            break;    int tx2=i-1;             //波峰右值    for(i=tx1;i>0;i--)       //判断单调区间        if(a[i-1]>=a[i]){            printf("NO\n");            return 0;        }    for(i=tx2;i<n;i++)       //判断单调区间        if(a[i]<=a[i+1]){            printf("NO\n");            return 0;        }    printf("YES\n");    return 0;}

阅读全文
0 0
原创粉丝点击