弗拉德找到了一个由 n 个整数组成的数组 a ,并决定按不递减的顺序排序。
为此,弗拉德可以多次执行下面的操作:
提取数组的第一个元素并将其插入末尾;
将个元素与前一个元素对调,直到它变成第一个元素或严格大于前一个元素。
请注意,这两个操作都是操作的一部分,对于一个操作,必须同时应用这两个操作。
例如,如果对数组 [ 4,3,1,2,6,4 ]进行操作,它将发生如下变化:
[ 4,3,1,2,6,4 ];
[ 3,1,2,6,4,4 ];
[ 3,1,2,6,4,4 ];
[ 3,1,2,4,6,4 ].
弗拉德没有时间进行所有的操作,所以他要求你确定对数组进行排序所需的最少操作数,或者报告说这是不可能的。
输入
输入的第一行包含一个整数 t ( 1 ≤ t ≤ 1 0 4 ) t ( 1≤t≤10^4 ) t(1≤t≤104) - 测试用例的数量。测试用例说明如下。
每个测试用例的第一行包含一个整数 n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n ( 1≤n≤2⋅10^5 ) n(1≤n≤2⋅105) - 数组的长度。
每个测试用例的第二行包含 n n n 个整数 a 1 , a 2 , a 3 , … , a n ( 1 ≤ a i ≤ 1 0 9 ) a_1,a_2,a_3,…,a_n ( 1≤a_i≤10^9 ) a1,a2,a3,…,an(1≤ai≤109) - 数组的元素。
保证所有测试用例中 n n n 的总和不超过 2 ⋅ 1 0 5 2⋅10^5 2⋅105 。
输出
对于每个测试用例,输出一个整数 - 对数组进行排序所需的最少操作数。如果无法排序,则输出 −1 作为答案。
首先我们可以找到这一序列的最小值,那么可以得知,最小值前面的数一定都要被移动,因为要保持数列是不递减顺序。
那么如果前面的数都移动结束之后,我们就不能再移动了,因为最小值一定不会严格小于任何数,所以就会陷入死循环,所以可以知道如果最小值后面的序列原本如果是递减序的话,那么就没有可能将其正常排序了(因为最小值前面的数移动到后面去不会影响后面原本的顺序)。
CODE:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
#define endl '\n'int a[N];void solve(){int n;cin >> n;int mm = 1;for(int i = 1;i <= n;i++){cin >> a[i];if(a[i] < a[mm])mm = i;}for(int i = mm;i+1 <= n;i++){if(a[i] > a[i+1]){cout << -1 << endl;return;}}cout << mm-1 << endl;
}int main(){int T;cin >> T;while(T--){solve();}return 0;
}
我会用MARKDOWN颜色了哈哈哈