HDU 5532:Almost Sorted Array

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5532


题目翻译:给出一个N个数的序列,然后看删除一个序列中的一个数后,序列是否可以变成非递增或非

递减序列,也就是可以是相等的。


解题思路:如果原序列非递增非递减序列的长度大于等于N-1时,就是,原来时模拟的,可是模拟的时候

发现有点问题,然后用LIS写,但是由于它是不严格递增的,有相等的情况,自己的写的二分查找一直写

不对,最后真的放弃二分加LIS了,还是回到原来的模拟方法。参考了别人的方法,发现和自己原来写的

差不多,不过忘考虑了一种情况。


AC代码:

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int inf = 0x3f3f3f3f;
const int maxn = 1e6;
int num[maxn];
int main() {
    int T,N;
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&N);
        for(int i = 1; i <= N; i++) {
            scanf("%d",&num[i]);
        }
        int num1,num2;
        num1 = 0;
        num2 = 0;
        ///按从小到大走
        num[0] = -inf;
        num[N+1] = inf;
        bool flag1 = true;
        bool flag2 = true;
        for(int i = 1; i <= N; i++) {
            ///这种情况只能出现一个
            if(num[i]<num[i-1]) {
                if(num1 == 1) {
                    flag1 = false;
                    break;
                }
                num1++;
                if(num[i+1]>=num[i-1] || num[i]>=num[i-2])
                    continue;
                else {
                    flag1 = false;
                    break;
                }
            }
        }
        //从大到小
        num[0] = inf;
        num[N+1] = -inf;
        for(int i = 1; i <= N; i++) {
            if(num[i] > num[i-1]) {
                if(num2 == 1) {
                    flag2 = false;
                    break;
                }
                num2++;
                if(num[i+1]<=num[i-1] || num[i]<=num[i-2]) {
                    continue;
                } else {
                    flag2 = false;
                    break;
                }
            }
        }
        if(flag1 || flag2) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值