B. Jumps
D. Sequence and Swaps
这是一个害怕自己思路逐渐退化,突然醒悟的菜鸡的自言自语,如果有错的话大胆的来戳我!!!!!!
提示:以下是本篇文章正文内容
D. Sequence and Swaps
time limit per test1.5 seconds
memory limit per test512 megabytes
inputstandard input
outputstandard output
You are given a sequence a consisting of n integers a1,a2,…,an, and an integer x. Your task is to make the sequence a sorted (it is considered sorted if the condition a1≤a2≤a3≤⋯≤an holds).
To make the sequence sorted, you may perform the following operation any number of times you want (possibly zero): choose an integer i such that 1≤i≤n and ai>x, and swap the values of ai and x.
For example, if a=[0,2,3,5,4], x=1, the following sequence of operations is possible:
choose i=2 (it is possible since a2>x), then a=[0,1,3,5,4], x=2;
choose i=3 (it is possible since a3>x), then a=[0,1,2,5,4], x=3;
choose i=4 (it is possible since a4>x), then a=[0,1,2,3,4], x=5.
Calculate the minimum number of operations you have to perform so that a becomes sorted, or report that it is impossible.
Input
The first line contains one integer t (1≤t≤500) — the number of test cases.
Each test case consists of two lines. The first line contains two integers n and x (1≤n≤500, 0≤x≤500) — the number of elements in the sequence and the initial value of x.
The second line contains n integers a1, a2, …, an (0≤ai≤500).
The sum of values of n over all test cases in the input does not exceed 500.
Output
For each test case, print one integer — the minimum number of operations you have to perform to make a sorted, or −1, if it is impossible.
Example
inputCopy
6
4 1
2 3 5 4
5 6
1 1 3 4 4
1 10
2
2 10
11 9
2 10
12 11
5 18
81 324 218 413 324
outputCopy
3
0
0
-1
1
3
题意:这道题需要我们在一个长度为n可能无序的数组中,判断通过一个x不断交换,最少需要几步才可以换成一个有序的数组。
解决方案:因为自己太菜,我也是看了大佬的博客的,首先我们想到了直接暴力解决,首先我们要判断原数组是否有序,如果有序就直接输出0好了。那么我再引用一个数组来,排序,用以和原数组a比较每一个元素,如果a[i]>b[i],那我们就可以记数,表示需要经过一步。
#include<bits/stdc++.h>
#define rep(i, a, b) for(int i =a; i < b; i++)
#define per(i, a, b) for(int i = b; i >=a;i--)
#define ll long long
const int maxn = 1e5 + 10;
using namespace std;
const int inf = 0x3f3f3f3f;//无穷大
const int mod = 1e9 + 7;
int a[maxn];
int t, n, x;
void check(int *a) {
bool flag = true;
rep(i, 0, n - 1) {
if (a[i] > a[i + 1]) {
flag = false;
break;
}
}
if (flag) {
cout << 0 << endl;
return;
}
int ans = inf, cnt;
vector<int> b;
rep(i, 0, n) {
b.clear();
cnt = 0;
rep(j, 0, n + 1) {
if (i != j) {
b.push_back(a[j]);
}
}
sort(b.begin(), b.end());
rep(j, 0, n) {
if (b[j] > a[j]) {
cnt = inf;
break;
} else if (b[j] < a[j]) {
cnt++;
}
}
ans = min(ans, cnt);
}
if (ans == inf) cout << -1 << endl;
else cout << ans << endl;
}
int main() {
cin >> t;
while (t--) {
cin >> n >> x;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
a[n] = x;
check(a);
}
return 0;
}
做题记录到此结束,坚持做一道有意思的题,就过来补博客!