正经题解|新年排列
2024-03-22 13:58:14
发布于:浙江
17阅读
0回复
0点赞
题面大意
给你一个长度为的全排列,和一个整数,每次可以任意选择个元素,以升序移动到的末尾,直到为升序。
题意分析
求最小操作次数,使得变为升序
解题思路
找到以1开头的最长上升序子序列,那么不属于部分的则都要移动,将非部分的元素移动到的尾部就好。
时间复杂度解析
我们只需要遍历一次序列,就能找到子序列,复杂度为。
代码演示
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main() {
int n,k;
cin >> n >> k;
int j = 0;
for(int i=0;i<n;i++) {
cin >> a[i];
if (a[i] == 1) j = i + 1;
}
int l = 1, len = 1;
for(;j<n;j++) {
if (a[j] == l + 1) {
l = l + 1;
len++;
}
}
cout << (n - len) / k + ( (n - len) % k > 0)<< endl;
return 0;
}
这里空空如也
有帮助,赞一个