C. Make It Good(思维)

题目
在这里插入图片描述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)。
输出
对于每个测试用例,打印答案:要使其成为一个好的数组,需要从中删除的元素的最短前缀的长度。
注意
在这个例子的第一个测试用例中,数组a已经很好了,所以我们不需要删除任何前缀。
在本例的第二个测试用例中,初始数组a不是很好。让我们删除a的前4个元素,结果是[4,5,2]。得到的数组是好的。你可以证明,如果你删除的第一个元素的数量较少,结果将不好。
思路:由题意得数组从后往前只能出现一个“山峰”即数字大小先上升后下降的情况,若下降途中出现上升情况则从上升那个位置及以前的数都要除去

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;
int a[200020];
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,pos=0,ans=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]);
		}
		for(int i=n-1;i>=0;i--){
			if(a[i]>a[i-1]) pos=1;
			if(pos&&a[i]<a[i-1]){
				ans=i;
				break;
			}
		}
		printf("%d\n",ans);
	}
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值