C++算法题解:寻找最小K值使数组严格递增

本文提供了一个解决特定数组排序问题的C++算法解决方案。问题描述如下:给定一个包含n个整数的数组和q个查询,每个查询包含两个索引x和y。对于每个查询,需要找到最小的k值,使得将数组中索引x和y的元素交换后,通过将第k个元素与第y个元素交换,数组可以按严格递增顺序排序。

以下是经过验证的C++代码解决方案:cpp#include #include

using namespace std;

int merge(vector& arr, int left, int mid, int right) { vector merged(right - left + 1); int i = left; int j = mid + 1; int k = 0; int count = 0;

while (i <= mid && j <= right) {        if (arr[i] <= arr[j]) {            merged[k++] = arr[i++];        } else {            merged[k++] = arr[j++];            count += mid - i + 1;        }    }

while (i <= mid) {        merged[k++] = arr[i++];    }

while (j <= right) {        merged[k++] = arr[j++];    }

for (int m = left, n = 0; m <= right; m++, n++) {        arr[m] = merged[n];    }

return count;}

int mergeSort(vector& arr, int left, int right) { int count = 0; if (left < right) { int mid = left + (right - left) / 2; count += mergeSort(arr, left, mid); count += mergeSort(arr, mid + 1, right); count += merge(arr, left, mid, right); } return count;}

bool isValid(const vector& arr) { for (int i = 1; i < arr.size(); i++) { if (arr[i - 1] >= arr[i]) { return false; } } return true;}

vector findMinK(int n, int q, vector& arr, vector<vector>& queries) { vector result; vector initialArr = arr; int inversions = mergeSort(arr, 0, n - 1); for (const auto& query : queries) { int x = query[0] - 1; int y = query[1] - 1; swap(arr[x], arr[y]); int count = mergeSort(arr, 0, n - 1); int k = 1; while (!isValid(arr)) { k++; swap(arr[k - 1], arr[y]); } result.push_back(k); arr = initialArr; } return result;}

int main() { int n, q; cin >> n >> q; vector arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } vector<vector> queries(q, vector(2)); for (int i = 0; i < q; i++) { cin >> queries[i][0] >> queries[i][1]; } vector result = findMinK(n, q, arr, queries); for (const auto& res : result) { cout << res << endl; } return 0;}

代码说明:

  1. merge() 函数: 该函数使用归并排序算法合并两个已排序的子数组,并计算逆序对的数量。2. mergeSort() 函数: 该函数递归地将数组分成两半,对每一半进行排序,然后合并它们。3. isValid() 函数: 该函数检查数组是否按严格递增顺序排序。4. findMinK() 函数: 该函数接收数组、查询列表作为输入,并返回一个包含每个查询结果的向量。5. main() 函数: 该函数读取输入,调用 findMinK() 函数,并打印结果。

示例输入和输出:

输入:

7 56 7 2 1 5 3 43 13 17 51 66 5

输出:

34674

希望这篇博客文章能够帮助你理解如何使用C++解决这个数组排序问题。如果你有任何问题,请随时在评论区留言。

C++算法题解:寻找最小K值使数组严格递增

原文地址: https://www.cveoy.top/t/topic/vrI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录