1. 程式人生 > >UPC 9260: Almost Sorted Array

UPC 9260: Almost Sorted Array

題目描述

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?

輸入

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≤a i≤105 There are at most 20 test cases with n > 1000.

輸出

For each test case, please output ”‘YES‘” if it is almost sorted. Otherwise, output ”‘NO‘” (both without quotes).

樣例輸入

3
3
2 1 7
3
3 2 1
5
3 1 4 1 5

樣例輸出

YES
YES
NO

題意:給定數列,刪除一個元素,數列是否可以成為單調數列?

思路:按遞減數列排序,檢視有幾個不滿足的數並標記其位置,若沒有則可以,多餘一個則不可以,等於一個是需要看去掉此元素或去掉它前面的一個元素是否可以。

按遞增數列排序同上……

#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define INF 0x3f3f3f3f
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        int a[100010];
        scanf("%d",&n);
        int cnt=0,cnt1=0;
        int num=0,num1=0;
        int temp=1,temp1=1;
        scanf("%d",&a[0]);
        for(int i=1; i<n; i++)
        {
            scanf("%d",&a[i]);
            if(a[i]>=a[i-1])//遞增數列
            {
                cnt++;
            }
            else
            {
                temp=i;//記錄位置
                num++;
            }
            if(a[i]<=a[i-1])//遞減數列
            {
                cnt1++;
            }
            else
            {
                temp1=i
                num1++;
            }

        }
        if(cnt==n-1||cnt1==n-1||(num==1&&(temp==1||temp==n-1||a[temp-1]<=a[temp+1]||a[temp-2]<=a[temp]))||(num1==1&&(temp1==1||temp1==n-1||a[temp1-1]>=a[temp1+1]||a[temp1-2]>=a[temp1])))
            printf("YES\n");
        else
            printf("NO\n");

    }
    return 0;
}