zoukankan      html  css  js  c++  java
  • hdu 1394 zoj 1484 求旋转序列的逆序数(并归排序)

    题意:给出一序列,你可以循环移动它(就是把后面的一段移动到前面),问可以移动的并产生的最小逆序数。

    求逆序可以用并归排序,复杂度为O(nlogn),但是如果每移动一次就求一次的话肯定会超时,网上题解都说可以用并归做,想了好久,最后发现"the next line contains a permutation of the n integers from 0 to n-1",坑爹的家伙,这些数竟然是从0到n-1的。

    这样就可以做了,推导一下可以发现每移动一位,数列的逆序数就会又规律的变化,和它有关的且它是较大数的逆序数对会减小,其实就是序列排序完比它小的数的个数,其实就是它本身的值;而它是较小数的逆序数对就是比它大的个数。

    所以只要排序一遍,求出当前逆序数,然后模拟一下循环一遍会产生的逆序数,取得最小值就行了。

    代码:

     /*
     *   Author:        illuz <iilluzen@gmail.com>
     *   Blog:          http://blog.csdn.net/hcbbt
     *   File:          hdu1394.cpp
     *   Lauguage:      C/C++
     *   Create Date:   2013-08-30 10:28:05
     *   Descripton:    hdu1394, Minimum Inversion Number, partitation, simutation 
     */
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define rep(i, n) for (int i = 0; i < (n); i++)
    #define repu(i, a, b) for (int i = (a); i < (b); i++)
    
    const int MAXN = 5100;
    int n, a[MAXN], b[MAXN], t[MAXN];
    int cnt, Min, sum;
    
    void mergeSort(int* A, int x, int y) {
    	if (y - x <= 1) return;
    	int m = x + (y - x) / 2;
    	mergeSort(A, x, m);
    	mergeSort(A, m, y);
    	int p = x, q = m, i = x;
    	while (p < m || q < y)
    		if (q >= y || (p < m && A[p] <= A[q]))
    			t[i++] = A[p++];
    		else
    			t[i++] = A[q++], cnt += m - p;
    	repu(i, x, y) A[i] = t[i];
    }
    
    int main() {
    	while (scanf("%d", &n) != EOF) {
    		rep(i, n)
    			scanf("%d", &a[i]);
    		int Min = 0xffffff;
    		memcpy(b, a, sizeof(a));
    		cnt = 0;
    		mergeSort(a, 0, n);
    		sum = Min = cnt;
    		rep(i, n) {
    			sum = sum - b[i] + (n - 1 - b[i]);
    			Min = min(Min, sum);
    		}
    		printf("%d
    ", Min);
    	}
    	return 0;
    }
    


  • 相关阅读:
    美团面试(c++方向)
    浪潮面试-软开
    ofo C++面试
    B树、B+树等
    爱奇艺2017秋招笔试(C++智能设备方向)
    腾讯内推一面C++
    i++ 相比 ++i 哪个更高效?为什么?
    进程间的通讯(IPC)方式
    一台服务器能够支持多少TCP并发连接呢?
    可重入和不可重入
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3292126.html
Copyright © 2011-2022 走看看