Algorithm Description
2015-08-04 16:51
330 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/A
题意:
输入n,再输入n个数a[i],以输入的顺序排列,找出相邻元素最少要交换多少次才能让所有数以从小到大的顺序排列。n为0时结束循环。
案例:
intput
5
9
1
0
5
4
0
output
6
思路分析:
n<500000,用两层循环,时间复杂度为O(n2),显然这会超时,归并排序,它的时间复杂度为O(nlogn)。所以用归并排序求解。
利用递归,把序列划分成元素个数尽可能相等的两半,直到y-x<=1,一层一层的进行判断,当右边的数小于左边的数,把右边的数的位置减去左边的数的位置,即为交换次数,再把两个数重新储存。
注意:a[i]的范围过大,要记得用long long。
源代码如下:
题意:
输入n,再输入n个数a[i],以输入的顺序排列,找出相邻元素最少要交换多少次才能让所有数以从小到大的顺序排列。n为0时结束循环。
案例:
intput
5
9
1
0
5
4
0
output
6
思路分析:
n<500000,用两层循环,时间复杂度为O(n2),显然这会超时,归并排序,它的时间复杂度为O(nlogn)。所以用归并排序求解。
利用递归,把序列划分成元素个数尽可能相等的两半,直到y-x<=1,一层一层的进行判断,当右边的数小于左边的数,把右边的数的位置减去左边的数的位置,即为交换次数,再把两个数重新储存。
注意:a[i]的范围过大,要记得用long long。
源代码如下:
#include<iostream> #define maxn 500005 using namespace std; long long s,a[maxn],T[maxn]; void merge_sort(int x,int y,long long *b,long long *t) //归并排序 { if(y-x>1) { int m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(x,m,b,t); //左序列 merge_sort(m,y,b,t); //右序列 while(p<m||q<y) { if(q>=y||(p<m&&b[p]<=b[q])) t[i++]=b[p++]; else { t[i++]=b[q++]; s+=m-p; //记录交换次数 } } for(i=x;i<y;i++) b[i]=t[i]; //重新储存 } } int main() { int n;cin>>n; while(n) { s=0; for(int i=0;i<n;i++) cin>>a[i]; merge_sort(0,n,a,T); cout<<s<<endl; cin>>n; } return 0; }
相关文章推荐
- Google浏览器 隐身模式 -incognito
- google地图引入网页
- ubuntu14.04重装sogou
- ubuntu14.04重装sogou 分类: 软件插件学习 2015-08-04 15:00 7人阅读 评论(0) 收藏
- django学习笔记之开发功能之前的准备
- .bat文件中start, pause,goto以及rem的用法
- Algorithms—199.Binary Tree Right Side View
- LightOJ 1051 Good or Bad 解题报告
- Lumia1520刷欧版固件去除联通logo使用4G
- django学习笔记之(model设计与实现)
- Django开发中DJANGO_SETTINGS_MODULE is undefined解决方案
- Django+ajax实现页面底部加载
- 利用Google Earth制作DEM
- Algorithms—215.Kth Largest Element in an Array
- win7下安装Django
- Algorithms—216.Combination Sum III
- cloudfoundry上搭建go服务端
- ceph存储 Google perftools工具内存检测以及性能分析
- Percolator Google的海量数据增量处理系统
- p3115 高精度练习之减法