hdu 1394 Minimum Inversion Number
2015-05-30 10:19
351 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394
归并排序求逆序数。。
归并排序求逆序数。。
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #define mid ((l+r)>>1) using std::min; const int Max_N = 5010; const int INF = ~0u >> 1; int cnt, arr[Max_N], ret[Max_N], temp[Max_N]; void Merge(int *A, int l, int m, int r) { int p = 0; int x = l, y = m + 1; while (x <= m && y <= r) { if (A[x] > A[y]) cnt += m - x + 1, temp[p++] = A[y++]; else temp[p++] = A[x++]; } while (x <= m) temp[p++] = A[x++]; while (y <= r) temp[p++] = A[y++]; for (x = 0; x < p; x++) A[l + x] = temp[x]; } void MergeSort(int *A, int l, int r) { if (l < r) { MergeSort(A, l, mid); MergeSort(A, mid + 1, r); Merge(A, l, mid, r); } } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w+", stdout); #endif int n; while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) scanf("%d", &arr[i]), ret[i] = arr[i]; cnt = 0; MergeSort(arr, 0, n - 1); int res = INF; for (int i = 0; i < n; i++) { cnt = cnt + n - ret[i] - ret[i] - 1; res = min(res, cnt); } printf("%d\n", res); } return 0; }
相关文章推荐
- 前端知识质量内容网址
- 那个和你一起吃路边摊的姑娘为什么没有陪你走到最后
- 梯度-牛顿-拟牛顿优化算法和实现
- HDU 5239 上海大都会 D题(线段树+数论)
- 阅读8.9.10章
- 2013斯坦福大学iOS应用开发学习笔记 11 Table View and iPad
- 与人说话
- poj1061青蛙的约会 扩展欧几里得
- 常用正则表达式
- 1.CentOS 6.5 静态网站制作学习
- ZOJ 3713 In 7-bit
- ASP.NET MVC中如何使用PartialView
- 一步一步教你实现CTreeCtrl 自绘
- mysql之group by,order by
- IE8~实现未知节点高度实现垂直居中
- 使用Dojo(一) widget的生命周期管理
- SSDT-BI之七:循环任务(容器)
- 闲谈MongoDb+GridFS+Nginx
- Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析
- 通过代码自定义cell