edu99 div.2 Sequence and Swaps优雅的暴力

简介: 首先找到不满足非递减的位置的元素,然后考虑将这个数换掉,但是问题是换掉这个数要满足a[i] > x;这样一来,就需要找到找到这样一个满足条件的位置,并记录在pos中,然后从满足条件的 pos往后到 i - 1的部分进行交换,每交换一次就讲记录答案的ans加一,然后判断是不是满足非递减的情况,如果满足的时候,输出ans,不满足的时候直接输出 -1在中途的时候可以优化一下下,如果说交换了一波时候还没有满足a[i] >= a[i-1];就直接记录下,最后输出 -1
                      time limit per test1.5 seconds
                      memory limit per test512 megabytes
                      inputstandard input
                      outputstandard output

微信图片_20220607175939.pngExample


input


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


output


3
0
0
-1
1
3


首先找到不满足非递减的位置的元素,然后考虑将这个数换掉,但是问题是换掉这个数要满足a[i] > x;这样一来,就需要找到找到这样一个满足条件的位置,并记录在pos中,然后从满足条件的 pos往后到 i - 1的部分进行交换,每交换一次就讲记录答案的ans加一,然后判断是不是满足非递减的情况,如果满足的时候,输出ans,不满足的时候直接输出 -1

在中途的时候可以优化一下下,如果说交换了一波时候还没有满足a[i] >= a[i-1];就直接记录下,最后输出 -1


int a[maxn];
int main()
{
    int _ = read;
    while(_--){
        int n = read,x=read;
        for(itn i=1;i<=n;i++) cin >> a[i];
        int flag = 1;
        int ans = 0;
        for(int i=2;i<=n;i++){
            int pos = 0;
            if(a[i] < a[i-1]){
                for(int j=1;j<=i-1;j++){
                    if(a[j] > x){
                        pos = j;///get the right position
                        break;
                    }
                }
                if(pos == 0) break;
                for(int j=pos;j<=i-1;j++){
                    if(a[j] > x){/// swap the two numbers
                        swap(x,a[j]);
                        ans ++;
                    }
                }
                if(a[i] < a[i-1]){/// output -1
                    flag = 0;
                    break;
                }
            }
        }
        if(flag == 0){
            puts("-1");
            continue;
        }
        for(int i=1;i<n;i++){
            if(a[i] > a[i+1]){
                flag = 0;
                break;
            }
        }
        if(flag) cout << ans <<endl;
        else puts("-1");
    }
    return 0;
}
目录
相关文章
|
2月前
|
C++
两种解法解决LCR 008. 长度最小的子数组【C++】
两种解法解决LCR 008. 长度最小的子数组【C++】
|
8月前
|
人工智能 算法
Hungry Sequence (找递增数列)
Hungry Sequence (找递增数列)
34 0
|
9月前
UVa787 - Maximum Sub-sequence Product(最大连续乘积子串)
UVa787 - Maximum Sub-sequence Product(最大连续乘积子串)
28 0
|
10月前
|
文件存储
Easy Number Challenge(埃式筛思想+优雅暴力)
Easy Number Challenge(埃式筛思想+优雅暴力)
59 0
LeetCode 60. Permutation Sequence
集合[1,2,3,...,n]总共包含n的阶乘个独特的排列。
52 0
LeetCode 60. Permutation Sequence
|
Java C++
HDU-1005,Number Sequence(有规律的数学题)
HDU-1005,Number Sequence(有规律的数学题)