zoukankan      html  css  js  c++  java
  • HDU 5532——Almost Sorted Array——————【技巧】

    Almost Sorted Array

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
    Total Submission(s): 236    Accepted Submission(s): 113


    Problem Description
    We are all familiar with sorting algorithms: quick sort, merge sort, heap sort, insertion sort, selection sort, bubble sort, etc. But sometimes it is an overkill to use these algorithms for an almost sorted array.

    We say an array is sorted if its elements are in non-decreasing order or non-increasing order. We say an array is almost sorted if we can remove exactly one element from it, and the remaining array is sorted. Now you are given an array a1,a2,,an, is it almost sorted?
     
    Input
    The first line contains an integer T indicating the total number of test cases. Each test case starts with an integer n in one line, then one line with n integers a1,a2,,an.

    1T2000
    2n105
    1ai105
    There are at most 20 test cases with n>1000.
     
    Output
    For each test case, please output "`YES`" if it is almost sorted. Otherwise, output "`NO`" (both without quotes).
     
    Sample Input
    3
    3
    2 1 7
    3
    3 2 1
    5
    3 1 4 1 5
     
    Sample Output
    YES
    YES
    NO
     
    Source
     
     
    题目大意:给你n个数的序列,问你能否从中删除一个数,让剩下的序列为不递增或不递减。
     
    解题思路:考虑第一个是否一定保留第一个数字。如果删除第一个数字,那么直接从第二个数字往后,判断序列是否是不递增或不递减的。如果不删除第一个数字,那么发现只删除一个数字满足的呈现这两种情况。以判断不递减为例。对于序列 7 8 1000 9 10 来说,中间那个数字过分得大了,如果保留1000,那么后边的序列都会不能用,所以,我们需要删除的是1000,这样序列才会呈现不递减。对于序列 7 8 1 9 10来说,很明显,1是要删除的。删除1后,这个序列才会呈现不递减。于是我们判断是否a[i]<a[i-1]。如果有,那么说明有元素需要删除,对于第一种情况,我们的i会指向9,同时我们需要判断,是否a[i]>=a[i-2],也就是这里的9与8。对于第二种情况,我们同样判断是否a[i]<a[i-1],但是这时候的i指向1,我们要判断是否a[i+1]>=a[i-1]。如果不满足,说明这里需要删除的元素不只一个,所以直接false,否则,记录已经删除过一个元素。如果下次又有a[i]<a[i-1],那么直接false。
     
     
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    const int maxn = 100010;
    const int INF = 0x3f3f3f3f;
    int a[maxn];
    bool jud1(int n){
        int tmp = a[2];
        for(int i = 2; i <=n; i++){
            if(tmp > a[i]){
                return false;
            }else{
                tmp = a[i];
            }
        }
        return true;
    }
    bool jud2(int n){
        int tmp = a[2];
        for(int i = 2; i <= n; i++){
            if(tmp < a[i]){
                return false;
            }else{
                tmp = a[i];
            }
        }
        return true;
    }
    bool jud3(int n){
        a[0] = 0; a[n+1] = INF;
        int tim = 0;
        int fir = 0;
        for(int i = 2; i <= n; i++){
            if(a[i]<a[i-1]){
                if(fir == 1)
                    return false;
                fir++;
                if(a[i+1]>=a[i-1]||a[i]>=a[i-2]){
                    continue;
                }else{
                    return false;
                }
            }
        }
        return true;
    }
    bool jud4(int n){
        a[0] = INF; a[n+1] = 0;
        int tim = 0;
        int fir = 0;
        for(int i = 2; i <= n; i++){
            if(a[i]>a[i-1]){
                if(fir == 1)
                    return false;
                fir++;
                if(a[i+1]<=a[i-1]||a[i]<=a[i-2]){
                    continue;
                }else{
                    return false;
                }
            }
        }
        return true;
    }
    int main(){
        int T,n,m;
        scanf("%d",&T);
        while(T--){
           scanf("%d",&n);
           for(int i = 1; i <= n; i++){
                scanf("%d",&a[i]);
           }
            if(jud1(n)){
                puts("YES");
                continue;
            }
            if(jud2(n)){
                puts("YES");
                continue;
            }
            if(jud3(n)){
                puts("YES");
                continue;
            }
            if(jud4(n)){
                puts("YES");
                continue;
            }
            puts("NO");
        }
        return 0;
    }
    /*
    555
    4
    8 6 7 8
    4
    8 6 7 7
    5
    1 2 1000 7 8
    5
    1 2 100 2 3
    4
    1 1 1 1
    6
    7 8 1 1 1 10
    
    */
    

      

     
  • 相关阅读:
    如何将u盘、移动硬盘转化为活动分区--绝招
    jstl错误排除:According to TLD or attribute directive in tag file, attribute value does not accept any expressions
    eclipse中package explore和project explore 怎么相互切换???
    硬盘知识区
    Sublime Text 3下Emmet使用技巧
    sublime text3中设置Emmet输入标签自动闭合
    window如何分区
    HTTP缓存
    react-router 4实现代码分割(code spliting)
    Vue练手项目(包含typescript版本)
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4930092.html
Copyright © 2011-2022 走看看