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.
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
Source
2015ACM/ICPC亚洲区长春站-重现赛(感谢东北师大)
题目大意:给你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 */