码迷,mamicode.com
首页 > 其他好文 > 详细

最少的交换

时间:2015-04-07 09:36:33      阅读:1014      评论:0      收藏:0      [点我收藏+]

标签:

最少的交换

最少的交换

题目描述

现在给你一个由 n 个互不相同的整数组成的序列,现在要求你任意交换相邻的两个数字,使序列成为升序序列,请问最少的交换次数是多少?
输入格式

输入包含多组测试数据。每组输入第一行是一个正整数 n(n<500000),表示序列的长度,当 n=0 时。
接下来的 n 行,每行一个整数 a[i](0<=a[i]<=999999999),表示序列中第 i 个元素。
输出

对于每组输入,输出使得所给序列升序的最少交换次数。
样例输入

5
9
1
0
5
4
3
1
2
3
0
样例输出

6
0

#include <iostream>

using namespace std;

const int maxn = 500010;
int a[maxn];
int aux[maxn];
long long sum;
int n;

void merge(int l, int mid, int r) {
    int i = l;
    int j = mid+1;
    int end1 = mid;
    int end2 = r;

    for (int t = l; t <= r; t++) {
        aux[t] = a[t];
    }

    for (int t = l; t <= r; t++) {
        if (j > end2) {
            a[t] = aux[i++];
        } else if (i > end1) {
            a[t] = aux[j++];
        } else if (aux[i] > aux[j]) {
            sum += mid-i+1;
            a[t] = aux[j++];
        } else if (aux[i] <= aux[j]) {
            a[t] = aux[i++];
        }
    }
}

void msort(int l, int r) {
    if (l < r) {
        int mid = (l + r)  / 2;
        msort(l, mid);
        msort(mid+1, r);
        merge(l, mid, r);
    }
}


int main(void) {
    while (cin >> n && n) {
        sum = 0;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        msort(0, n-1);
        cout << sum << endl;
    }

    return 0;
}

最少的交换

标签:

原文地址:http://www.cnblogs.com/sunznx/p/4397475.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!