ACM: 计算交换次数的排序题 poj 22…
2016-05-19 23:17
429 查看
Ultra-QuickSort
Description
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
In this problem, you have to
analyze a particular sorting algorithm. The algorithm processes a
sequence of n distinct integers by swapping two adjacent sequence
elements until the sequence is sorted in ascending order. For the
input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort
needs to perform in order to sort a given input sequence.
Input
The input contains several test cases. Every test case begins
with a line that contains a single integer n <
500,000 -- the length of the input sequence. Each of the the
following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999,
the i-th input sequence element. Input is terminated by a sequence
of length n = 0. This sequence must not be processed.
Output
For every input sequence, your program prints a single line
containing an integer number op, the minimum number of swap
operations necessary to sort the given input sequence.
Sample Input
5
9 1 0 5 4
3
1 2 3
0
Sample Output
6
0
题意: 将序列排序,从小到大.计算交换的次数,交换只可以和左右相邻的数字交换.
解题思路:
1. 交换排序的类型,选择归并排序.
2. 计算二路归并的时候, mid - p + 1 (p: 序列的下标,mid: 是二分的中介.)
代码:
#include <cstdio>
#include <iostream>
using namespace std;
#define MAX 500003
int a[MAX];
int t[MAX];
int n;
long long merge_sort(int start,int end,int len)
{
if(len ==
0)
return 0;
long long
cur = 0;
int mid =
(start+end) / 2;
cur +=
merge_sort(start,mid,mid-start);
cur +=
merge_sort(mid+1,end,end-mid-1);
int p =
start , q = mid+1;
int k =
start;
for(int i =
0; i <= len; ++i)
{
if(q > end || (p <=
mid && a[p] <
a[q]))
t[k++] = a[p++];
else
{
cur += mid-p+1;
t[k++] = a[q++];
}
}
for(;start
<= end; ++start)
a[start] = t[start];
return
cur;
}
int main()
{
//
freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF
&& n != 0)
{
for(int i = 0; i < n; ++i)
{
scanf("%d",&a[i]);
}
printf("%lld\n",merge_sort(0,n-1,n-1));
}
return
0;
}
相关文章推荐
- ACM: poj 3349 (学习hash多种方法.…
- ACM: 直接模拟题 poj 3087
- ACM: 广搜题+gcd判断是否有解 poj…
- ACM: 深搜+剪枝 poj 1416
- ACM: 深搜 poj 2676
- ACM:着色问题 poj 1129
- ACM: hash开散列 poj 3007 (Nothin…
- 动态改变easyui datagrid 列的title
- ACM: 模拟题 poj 2996
- ACM: dfs题 poj 1321 (n皇后问题)
- ACM: 三维迷宫广搜最短路 poj 2251…
- ACM: 模拟队列判定 poj 1426
- ACM: 广搜+素数 poj 3126 (素数表…
- linux入门
- ACM: poj 1664
- CentOS7 Docker Nginx部署及运行
- ACM: 数论 台州OJ 3151 (久违的数…
- ACM: 高速打素数表 TOJ 3749 (疯狂…
- ACM: 初中数学 poj 1328
- hdu_4714_Tree2cycle(树形DP)