zoukankan      html  css  js  c++  java
  • 2015ACM/ICPC亚洲区长春站-重现赛 1006 Almost Sorted Array

    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

    题意:给出一个序列,如果去掉一个元素,问剩下的序列是否是有序序列。

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<math.h>
    #include<stdlib.h>
    #include<algorithm>
    using namespace std;
    
    const int N=1e5+10;
    const int INF=0x3f3f3f3f;
    const int MOD=1e9+7;
    
    typedef long long LL;
    
    int a[N], flag;
    
    void Increase(int n)
    {
        int i, num, idex;
    
        num = flag = 0;
    
        for (i = 2; i <= n; i++)
        {
            if (a[i] < a[i-1])
            {
                num++;
                idex = i; ///标记不满足元素的下标
            }
        }
    
        if (num == 0) flag = 1;
    
        if (num == 1)
        {
            if (idex == n || idex == 2 || a[idex-2] <= a[idex] || a[idex-1] <= a[idex+1])
                flag = 1; ///如果这个不满足元素的左边和右边还是非递减的,那么可以去掉该元素,或者该元素前的第二个元素和该元素是非递减的,可以去掉该元素之前的第一个元素
        }
    }
    
    void Decrease(int n)
    {
        int idex, i, num;
    
        num = flag = 0;
    
        for (i = 2; i <= n; i++)
        {
            if (a[i] > a[i-1])
            {
                num++;
                idex = i;
            }
        }
    
        if (num == 0) flag = 1;
    
        if (num == 1)
        {
            if (idex == 2 || idex == n || a[idex-1] >= a[idex+1] || a[idex-2] >= a[idex])
                flag = 1;
        }
    }
    
    int main ()
    {
        int T, i, n;
    
        scanf("%d", &T);
    
        while (T--)
        {
            scanf("%d", &n);
            for (i = 1; i <= n; i++)
                scanf("%d", &a[i]);
    
            Increase(n); ///先判断是否是非递减序列:找到不满足条件的元素下标,并统计个数,个数<=1时才满足条件
            if (flag == 0) Decrease(n); ///如果不是非递减序列再判断是否是非递增序列
    
            if (flag == 1) printf("YES
    ");
            else printf("NO
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    [Hadoop in China 2011] 海狗不是狗 探秘支付宝准实时搜索查询
    [Hadoop in China 2011] 邵铮:揭秘FaceBook Puma演变及发展
    MongoDB学习笔记(一) MongoDB介绍及安装
    [Hadoop in China 2011] 人人网:基于Hadoop的SNS统计和聚类推荐
    运行中hadoop增加和删除datanode (*)
    第三届云计算大会 罗志国:中国移动大云的研发和实践(转载)
    [Hadoop in China 2011] 何鹏:Hadoop在海量网页搜索中应用分析
    Run hadoop example
    MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据
    [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • 原文地址:https://www.cnblogs.com/syhandll/p/4928129.html
Copyright © 2011-2022 走看看