zoukankan      html  css  js  c++  java
  • Almost Sorted Array ---- UVALive

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5200

    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.

    • 1 ≤ T ≤ 2000

    • 2 ≤ n ≤ 105

    • 1 ≤ ai ≤ 105

    • 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

    题意

    去掉一个数使得该序列单调递增或单调递减

    思路

    从第二位开始记录大于前面数字的数字个数 小于前面数字的数字的个数

    以及第一个大于前面数字的数字位置 第一个小于前面数字的数字位置

    个数小于等于1的那个可视为另类 只要判断去掉这个位置的数字或者去掉其前一项能否使得序列单调即可


    1
    #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int t, n, a[100005]; 7 int i, num1, num2, i1, i2, temp; 8 scanf("%d", &t); 9 while(t--) 10 { 11 scanf("%d", &n); 12 for(i=0; i<n; i++) 13 { 14 scanf("%d", &a[i]); 15 } 16 17 if(n<=3) 18 { 19 printf("YES "); 20 continue; 21 } 22 23 num1 = 0; 24 num2 = 0; 25 for(i=2; i<n; i++) 26 { 27 if(a[i]>a[i-1]) 28 { 29 if(num1==0) i1 = i; 30 num1++; 31 } 32 else if(a[i]<a[i-1]) 33 { 34 if(num2==0) i2 = i; 35 num2++; 36 } 37 } 38 if(num1==0||num2==0) 39 { 40 printf("YES "); 41 continue; 42 } 43 44 num1 = 0; 45 num2 = 0; 46 for(i=1; i<n; i++) 47 { 48 if(a[i]>a[i-1]) 49 { 50 if(num1==0) i1 = i; 51 num1++; 52 } 53 else if(a[i]<a[i-1]) 54 { 55 if(num2==0) i2 = i; 56 num2++; 57 } 58 } 59 60 if(num1<=1||num2<=1) 61 { 62 if(num2<=1) 63 { 64 if(i2-1>0) 65 { 66 temp = a[0]; 67 for(i=1; i<n; i++) 68 { 69 if(i==i2-1) continue; 70 if(a[i]<temp) break; 71 temp = a[i]; 72 } 73 if(i>=n) 74 { 75 printf("YES "); 76 continue; 77 } 78 } 79 80 81 temp = a[0]; 82 for(i=1; i<n; i++) 83 { 84 if(i==i2) continue; 85 if(a[i]<temp) break; 86 temp = a[i]; 87 } 88 if(i>=n) 89 { 90 printf("YES "); 91 continue; 92 } 93 94 } 95 if(num1<=1) 96 { 97 if(i1-1>0) 98 { 99 temp = a[0]; 100 for(i=1; i<n; i++) 101 { 102 if(i==i1-1) continue; 103 if(a[i]>temp) break; 104 temp = a[i]; 105 } 106 if(i>=n) 107 { 108 printf("YES "); 109 continue; 110 } 111 } 112 113 temp = a[0]; 114 for(i=1; i<n; i++) 115 { 116 if(i==i1) continue; 117 if(a[i]>temp) break; 118 temp = a[i]; 119 } 120 if(i>=n) 121 { 122 printf("YES "); 123 continue; 124 } 125 } 126 printf("NO "); 127 } 128 else printf("NO "); 129 } 130 return 0; 131 }
  • 相关阅读:
    Xenu Link Sleuth简单使用
    C#简单游戏外挂制作(以Warcraft Ⅲ为例)
    Silverlight InkPresenter 实现路径回放的探索
    Microsoft Virtual Earth Silverlight Map Control (CTP)快速上手
    【Azure实例】有趣的Silverlight应用:录播简笔画
    Azure Services Platform 入门系列文章索引页
    javascript原型的类继承
    javascript给类添加的方法
    checkbox 全选
    【nodejs】 在 Ubuntu 12.04 安裝 Node.js【转】
  • 原文地址:https://www.cnblogs.com/0xiaoyu/p/11502435.html
Copyright © 2011-2022 走看看