C - Make It Good CodeForces - 1385C

C - Make It Good

CodeForces - 1385C

题目大意:
删除最短的长度使数组成为一个“好”的数组(即一个非递减数组 可以相等)
操作方法可以是选择数组的第一个或最后一个元素,将其从数组中移除,然后把这个元素放在另一个数组末尾。
通过这种操作如果可以把数组变成一个好的数组,打印需要删除的元素数量(可以为0)
思路一
从最后一个数开始遍历,找到前一个数比这个数小的,记录位置,如果前一个数比这个数大,记录位置然后跳出循环
从我标记的位置开始往前遍历,如果找到一个数比他的前一个数和后一个数都小的数,记录这个数的位置(因为这里我是从0开始存的数组,所以我把g的初始值定为1)
如果查找一圈,发现不存在上述的情况则输出g-1,也就是0。
代码如下

#include 
using namespace std;
const int N=2e5+5;
int main()
{
    int t,n,a[N],b[N];
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=0; i>a[i];
        }
        int f=0,g;
        for(int i=n-1; i>=1; i--)
        {
            if(a[i]<=a[i-1])f=i-1;     //从后往前找这个数比前一个数小的,记录位置
            if(a[i]>a[i-1])  {f=i;break;}  //如果这个数比前一个数大,同样记录位置然后跳出循环
        }
        g=1;
        a[f+1]=0x3f3f3f3f;   //给f+1一个最大值,防止出现数组越界的情况
        for(int i=f; i>0; i--)
        {
            if(a[i]

思路二
从最后一个数开始遍历,如果这个数大于前一个数让c++;
(这个是为了找是否有不是递减数列的那个数)
再继续用if判断,如果这个是小于前一个数且存在上述说的情况(也就是说c!=0)那么用m标记这个数的位置,m即是需要删除的最小元素数量。
代码如下

#include 
using namespace std;
const int N=2e5+5;
int main()
{
    int t;
    cin>>t;
    while (t--)
    {
        int n, a[N], m = 0, c = 0;
        cin>>n;
        for (int i = 0; i>a[i];
        }
        for (int i = n - 1; i >0; i--)
        {
            if (a[i-1]a[i] && c!=0)  //找是否有不是递减数列的那个数
            {
                m = i;  //m标记这个数的位置
                break;
            }
        }
        cout<

原题内容
You are given an array a consisting of n integers. You have to find the length of the smallest (shortest) prefix of elements you need to erase from a to make it a good array. Recall that the prefix of the array a=[a1,a2,…,an] is a subarray consisting several first elements: the prefix of the array a of length k is the array [a1,a2,…,ak] (0≤k≤n).

The array b of length m is called good, if you can obtain a non-decreasing array c (c1≤c2≤⋯≤cm) from it, repeating the following operation m times (initially, c is empty):

select either the first or the last element of b, remove it from b, and append it to the end of the array c.
For example, if we do 4 operations: take b1, then bm, then bm−1 and at last b2, then b becomes [b3,b4,…,bm−3] and c=[b1,bm,bm−1,b2].

Consider the following example: b=[1,2,3,4,4,2,1]. This array is good because we can obtain non-decreasing array c from it by the following sequence of operations:

take the first element of b, so b=[2,3,4,4,2,1], c=[1];
take the last element of b, so b=[2,3,4,4,2], c=[1,1];
take the last element of b, so b=[2,3,4,4], c=[1,1,2];
take the first element of b, so b=[3,4,4], c=[1,1,2,2];
take the first element of b, so b=[4,4], c=[1,1,2,2,3];
take the last element of b, so b=[4], c=[1,1,2,2,3,4];
take the only element of b, so b=[], c=[1,1,2,2,3,4,4] — c is non-decreasing.
Note that the array consisting of one element is good.

Print the length of the shortest prefix of a to delete (erase), to make a to be a good array. Note that the required length can be 0.

You have to answer t independent test cases.

Input
The first line of the input contains one integer t (1≤t≤2⋅104) — the number of test cases. Then t test cases follow.

The first line of the test case contains one integer n (1≤n≤2⋅105) — the length of a. The second line of the test case contains n integers a1,a2,…,an (1≤ai≤2⋅105), where ai is the i-th element of a.

It is guaranteed that the sum of n does not exceed 2⋅105 (∑n≤2⋅105).

Output
For each test case, print the answer: the length of the shortest prefix of elements you need to erase from a to make it a good array.

Example
Input
5
4
1 2 3 4
7
4 3 3 8 4 5 2
3
1 1 1
7
1 3 1 4 5 3 2
5
5 4 3 2 3
Output
0
4
0
2
3
Note
In the first test case of the example, the array a is already good, so we don’t need to erase any prefix.

In the second test case of the example, the initial array a is not good. Let’s erase first 4 elements of a, the result is [4,5,2]. The resulting array is good. You can prove that if you erase fewer number of first elements, the result will not be good.

翻译
给你一个由n个整数组成的数组。必须找到要从中删除的元素的最小(最短)前缀的长度,才能使其成为一个好的数组。回想一下,数组a的前缀=[a1,a2,…,an]是由几个第一个元素组成的子数组:长度为k的数组a的前缀是数组[a1,a2,…,ak](0≤k≤n)。
长度为m的数组b称为good,如果可以从中获得一个非递减数组c(c1≤c2≤⋯≤cm),重复以下操作m次(最初,c为空):
选择b的第一个或最后一个元素,将其从b中移除,并将其附加到数组c的末尾。
例如,如果我们做4个运算:取b1,然后是bm,然后是bm−1,最后是b2,然后b变成[b3,b4,…,bm−3],c=[b1,bm,bm−1,b2]。
考虑以下示例:b=[1,2,3,4,4,2,1]。这个数组很好,因为我们可以通过以下操作序列从中获得非递减数组c:
取b的第一个元素,那么b=[2,3,4,4,2,1],c=[1];
取b的最后一个元素,那么b=[2,3,4,4,2],c=[1,1];
取b的最后一个元素,那么b=[2,3,4,4],c=[1,1,2];
取b的第一个元素,那么b=[3,4,4],c=[1,1,2,2];
取b的第一个元素,那么b=[4,4],c=[1,1,2,2,3];
取b的最后一个元素,所以b=[4],c=[1,1,2,2,3,4];
取b的唯一元素,因此b=[],c=[1,1,2,2,3,4,4]-c是非递减的。
请注意,由一个元素组成的数组是好的。
打印长度最短的前缀a要删除(擦除),使a成为一个好的数组。请注意,所需的长度可以是0。
你必须回答t个独立的测试用例。
输入
输入的第一行包含一个整数t(1≤t≤2⋅104)-测试用例数。接着是t测试用例。
测试用例的第一行包含一个整数n(1≤n≤2⋅105)-a的长度。测试用例的第二行包含n个整数a1,a2,…,an(1≤ai≤2⋅105),其中ai是a的第i个元素。
保证n之和不超过2⋅105(∑n≤2⋅105)。
输出
对于每个测试用例,打印答案:要使其成为一个好的数组,需要从中删除的元素的最短前缀的长度。
例子
输入
5
4
1 2 3 4
7
4 3 3 8 4 5 2

1 1 1
7
1 3 1 4 5 3 2
5
5 4 3 2 3
输出
0
4
0
2

注意
在这个例子的第一个测试用例中,数组a已经很好了,所以我们不需要删除任何前缀。
在本例的第二个测试用例中,初始数组a不是很好。让我们删除a的前4个元素,结果是[4,5,2]。得到的数组是好的。你可以证明,如果你删除的第一个元素的数量较少,结果将不好。

你可能感兴趣的:(算法)