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
    
    */
    

      

     
  • 相关阅读:
    Linux系统中DHCP的配置
    Linux系统下第三方软件安装实例
    Linux系统在启动过程中mbr主引导程序被破坏的解决方案
    Linux系统在启动过程中启动级别发生错误的解决办法
    Linux系统下超级用户密码的修改
    Linux系统在启动过程中内核文件丢失的解决方法
    Linux系统在启动过程中grub引导文件丢失的解决方法
    Linux之FTP服务
    Linux之LVM设备的管理
    Linux下设备的基本管理
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4930092.html
Copyright © 2011-2022 走看看