zoukankan      html  css  js  c++  java
  • ACM求经过k次移动后所得的逆序数

    Description

    bobo has a sequence a 1,a 2,…,a n. He is allowed to swap two adjacent numbers for no more than k times. 

    Find the minimum number of inversions after his swaps. 

    Note: The number of inversions is the number of pair (i,j) where 1≤i<j≤n and a i>a j.
     

    Input

    The input consists of several tests. For each tests: 

    The first line contains 2 integers n,k (1≤n≤10 5,0≤k≤10 9). The second line contains n integers a 1,a 2,…,a n (0≤a i≤10 9).
     

    Output

    For each tests: 

    A single integer denotes the minimum number of inversions.
     

    Sample Input

    3 1
    2 2 1
    3 0
    2 2 1
     

    Sample Output

    1
    2
     
    解题思路:
    题目大意是输入一组数据通过k次相邻位置的移动后,求 他所得的最小的逆序数。我们通过归并的方法求出这一组数据的逆序数,然后将这个逆序数减去所要移动的次数就得到了我们要求的最小的逆序数。
    程序代码:
    #include <iostream>
    using namespace std;
    int n;
    long long s;
    long long a[100005],t[100005];
    void fun(long long *a,int x,int y,long long*t)
    {
        if(y-x>1)
        {
            int m=x+(y-x)/2;
            int p=x,q=m,i=x;
            fun(a,x,m,t);
            fun(a,m,y,t);
            while(p<m||q<y)
            {
                if(q>=y||(a[p]<=a[q]&&p<m))
                    t[i++]=a[p++];
                else
                {
                    t[i++]=a[q++];
                    s=s+m-p;
                }
            }
            for( i=x;i<y;i++)
                a[i]=t[i];
        }
    }
    int main()
    {
        long long k;
        while(cin>>n>>k)
        {
            s=0;
            for(int i=0;i<n;i++)
                cin>>a[i];
            fun(a,0,n,t);
            if(s-k<=0)
                cout<<"0"<<endl;
            else
                cout<<s-k<<endl;
        }
        return 0;
    }
  • 相关阅读:
    NAND FLASH扇区管理
    ECC内存校验算法
    实时数据库简介
    windows标准控件
    PLC一些资料
    at命令
    Vi 常用命令列表
    PHP继承及实现
    Mongodb php扩展及安装
    Linux下jdk1.6安装指引
  • 原文地址:https://www.cnblogs.com/xinxiangqing/p/4713270.html
Copyright © 2011-2022 走看看