博客
关于我
POJ 4020 NEERC John's inversion 贪心+归并求逆序对
阅读量:803 次
发布时间:2023-03-03

本文共 1303 字,大约阅读时间需要 4 分钟。

为了解决这个问题,我们需要找到一种排列方式,使得对应颜色数字之间的逆序对总数最小。以下是详细的解决方法:

方法思路

  • 理解逆序对:逆序对是指在一个序列中,i < j 但 a[i] > a[j] 的情况。我们需要最小化蓝色和红色数字之间的逆序对总数。
  • 贪心策略:首先对蓝色数字进行排序,使其逆序对为0。然后处理红色数字时,尽可能交换它们来消除逆序对。
  • 归并排序:归并排序是一种有效计算逆序对的方法。归并过程中,统计左边元素大于右边元素的情况,累加逆序对的数量。
  • 解决代码

    #include 
    #include
    #include
    #include
    using namespace std;void merge_sort(vector
    &a, int l, int r, vector
    &t) { if (l >= r) return; int mid = l + (r - l) / 2; merge_sort(a, l, mid, t); merge_sort(a, mid + 1, r, t); int i = l, j = mid + 1; while (i <= mid && j <= r) { if (a[i] > a[j]) { t.push_back(a[j]); j++; } else { t.push_back(a[i]); i++; } } while (i <= mid) t.push_back(a[i]); while (j <= r) t.push_back(a[j]); for (int k = l; k <= r; ++k) { a[k] = t[k]; }}void main() { int n; scanf("%d", &n); vector
    a(n); for (int i = 0; i < n; ++i) { int r, b; scanf("%d", &r); scanf("%d", &b); a[i] = b; } sort(a.begin(), a.end()); vector
    t; merge_sort(a, 0, n-1, t); long long cnt = 0; for (int i = 0, j = 1; i < n; ++i, j++) { if (a[i] > a[j]) { cnt += n - j; j++; } } printf("%lld", cnt);}

    代码解释

  • 归并排序函数merge_sort函数对数组进行归并排序,并在合并过程中统计逆序对的数量。
  • 主函数:读取输入,排序数组,调用归并排序计算逆序对总数,并输出结果。
  • 通过这种方法,我们可以高效地找到逆序对总数最小的排列方式。

    转载地址:http://ybxfk.baihongyu.com/

    你可能感兴趣的文章
    Python 基础语法:基本数据类型(字符串)
    查看>>
    Python 基础语法:基本数据类型(集合)
    查看>>
    Python编程的终极十大工具
    查看>>
    python 堆排序
    查看>>
    python编程方式之一-函数式编程
    查看>>
    python 复习计划
    查看>>
    Python 多处理 apply_async 永远不会在 Windows 7 上返回结果
    查看>>
    Python 多处理 Numpy 随机
    查看>>
    Python 多处理 >= 125 列表永远不会完成
    查看>>
    Python 多处理:在第一个子错误时中止映射
    查看>>
    Python 多处理不断产生 pythonw.exe 进程而不做任何实际工作
    查看>>
    Python 多处理从不加入
    查看>>
    Python 多处理如何优雅地退出?
    查看>>
    Python 多处理将子进程的标准输出重定向到 Tkinter 文本
    查看>>
    Python 多处理库错误(AttributeError:__exit__)
    查看>>
    Python 多处理模块的 .join() 方法到底在做什么?
    查看>>
    python 多线程与GIL
    查看>>
    Python 多线程学习(转)
    查看>>
    python 多进程-基础
    查看>>
    python 多进程-进阶-进程池
    查看>>