话接上回因为小石头脑力不行那道题直接把他的CPU烧了使它忘记了怎么复原魔方傅yx大佬为了让他想起来便给了他一个像一条线一样的益智玩具当中有n个数这个玩具的规则是:每次只能交换两个数且两个数的距离小于k最后将这个数列从小到大排序傅yx大佬的问题是:要想将这个数列从小到大排序最少操作次数是多少?因为小石头大脑受损做不出来所以它想让你用程序完成这道题。有一个有n个数的不规则数列每次交换其中的两个数且让两
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int minOps = 0;
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1) {
int j = i + 1;
while (nums[j] != i + 1) {
j++;
}
if (j - i > k) {
minOps = -1;
break;
}
for (int l = j; l > i; l--) {
swap(nums[l], nums[l - 1]);
minOps++;
}
}
}
cout << minOps << endl;
return 0;
}
这段代码首先读入数列的长度n和交换两个数的距离k。然后读入数列的元素。接下来使用一个循环,对于每个元素检查是否在正确位置上,如果不在,则找到正确位置并进行交换操作。注意要判断交换的距离是否小于k,如果不满足则无法排序。最后输出最少操作次数
原文地址: https://www.cveoy.top/t/topic/ialI 著作权归作者所有。请勿转载和采集!