博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2299 二分思想
阅读量:7212 次
发布时间:2019-06-29

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

poj2299   http://poj.org/problem?id=2299

题意: 
一个含有n个数的数组, 每次只能交换相邻的两个数, 求最少操作多少次可以使该数组变成一个有序数组(从小到大)。 
分析: 
先说一下归并排序吧。 二分的思想, 就是将一元素集合分割成两个或更多个子集合,对每一个子集合分别排序,然后将排好序的子集合归并为一个集合。看图理解会好一点! 
这里写图片描述

归并排序核心操作:将一维数组中前后相邻的两个有序序列归并为一个有序序列。

那看一下我们这题, 其实就是在归并排序的过程中顺便计算一下移动次数, 就好了。 举个例子:例如图中前半部分数组{8,3,2,9}, 先分为两部分{8,3} 和{2,9} 。 {8,3}又分为{8} 和{3}, 8又在3前面所以合并8,3需要移动一次 sum= 1, {2,9}分为{2} he {9}, 本来就是有序的所以合并2,9不需要移动 sum= 1; 接下来这一步就该合并{3,8} 和{2,9}了。 2前面有两个比它大的数,所以要交换两次, 2才能排到第一位 sum = sum+2 = 3; 9比前面的都大就不用交换啦 sum= 3。

 

#include
#include
#include
#include
using namespace std;const int N = 500005;__int64 sum, a[N], c[N];int n;void merge1(int low, int high, int mid){ int i = low, j = mid + 1; int k = 0; while((i <= mid) && (j <= high)) { if(a[i] <= a[j]) { c[++k] = a[i]; i++; } else if(a[i] > a[j]) { c[++k] = a[j]; j++; sum += (mid - i + 1); } } while(i <= mid) c[++k] = a[i++]; while(j <= high) c[++k] = a[j++]; if(low < high) { for(int i = high; i >= low; i--) { a[i] = c[k]; k--; } }}//通过ac()不断将数组划分为更小的区间,再通过merge1()将划分的数组再合并回来, 并且合并的时候使其变得有序void ac(int low, int high){ if(low < high) { int mid = (low + high) / 2; ac(low, mid); ac(mid + 1, high); merge1(low, high, mid); }}int main(){ while(scanf("%d", &n) != EOF && n) { for(int i = 1; i <= n; i++) scanf("%I64d", &a[i]); sum = 0; ac(1, n); printf("%I64d\n", sum); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/wd-one/p/4495788.html

你可能感兴趣的文章
JavaScript Promise查缺补漏
查看>>
你还不知“dubbo”是个什么东西吗???
查看>>
Gin实践 番外 Golang交叉编译
查看>>
【401天】跃迁之路——程序员高效学习方法论探索系列(实验阶段158-2018.03.13)...
查看>>
浅谈面试中常考的两种经典布局——圣杯与双飞翼
查看>>
「旁门右道」CURL持久连接技巧
查看>>
(十五) 构建springmvc+mybatis+dubbo分布式平台-window安装dubbo管控台
查看>>
Oracle - 安装 Oracle Database 11g Release 2
查看>>
JavaScript iterator 设计模式
查看>>
关于PHP的OpenSSL的加密问题
查看>>
iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
查看>>
vue2 关于开发插件的几点思考
查看>>
Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验
查看>>
Linux网络——一种强制门户技术
查看>>
不得不学的http协议
查看>>
移动端采用Flexible将PX转换REM适配及开发中Retina屏1px边框的两种解决方案
查看>>
jquery梳理之常用选择器
查看>>
神秘的.user.ini文件
查看>>
JavaScript的正则表达式
查看>>
如何实现一个楼中楼的评论系统
查看>>