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

      

     
  • 相关阅读:
    【RS】Automatic recommendation technology for learning resources with convolutional neural network
    卷积神经网络的入门
    Debug 路漫漫-10:AttributeError: 'Embedding' object has no attribute 'get_shape'
    Debug 路漫漫-09:构建CNN时维度不一致问题
    Debug 路漫漫-08:Keras 版本升级函数变换导致的问题
    springboot 过滤器、拦截器、消息转换器、切片执行顺序 及区别
    java InputStream读取数据问题
    Springboot 2-OAuth 2修改登录加密方式
    Spring Boot Security Oauth2之客户端模式及密码模式实现
    oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4930092.html
Copyright © 2011-2022 走看看