Educational Codeforces Round 99 (Rated for Div. 2)(B,D题解)

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;
}


做题记录到此结束,坚持做一道有意思的题,就过来补博客!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值