zoukankan      html  css  js  c++  java
  • Minimum Inversion Number

     Minimum Inversion Number
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
    Submit Status

    Description

    The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj. 

    For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following: 

    a1, a2, ..., an-1, an (where m = 0 - the initial seqence) 
    a2, a3, ..., an, a1 (where m = 1) 
    a3, a4, ..., an, a1, a2 (where m = 2) 
    ... 
    an, a1, a2, ..., an-1 (where m = n-1) 

    You are asked to write a program to find the minimum inversion number out of the above sequences. 
     

    Input

    The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the n integers from 0 to n-1. 
     

    Output

    For each case, output the minimum inversion number on a single line. 
     

    Sample Input

    10 1 3 6 9 0 8 5 7 4 2
     

    Sample Output

    16
    /*
    题意:给你一个序列,让你求最小逆序对
    
    初步思路:按照题目的要求进行n次旋转,然后每次用树状数组求出最小逆序对
    
    #超时:果然暴力是不行的
    */
    #include <bits/stdc++.h>
    using namespace std;
    #define N 5005
    #define lowbit(x) x&(-x)
    #define INF 0x3f3f3f3f
    int a[N*2];
    int n;
    int c[N];
    int minn;
    int res=INF;
    void add(int x){
        while(x<N){
            c[x]++;
            x+=lowbit(x);
        }
    }
    int sum(int x){
        int res=0;
        while(x>0){
            res+=c[x];
            x-=lowbit(x);
        }
        return res;
    }
    void init(){
        memset(c,0,sizeof c);
        minn=0;
        res=0;
    }
    int main(){
        // freopen("in.txt","r",stdin);
        while(scanf("%d",&n)!=EOF){
            init();
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                a[i]++;
                minn+=sum(n)-sum(a[i]);
                add(a[i]);
            }
            res=minn;
            for(int i=1;i<=n;i++){
                res+=n-a[i]-(a[i]-1);
                // cout<<res<<endl;
                minn=min(res,minn);
            }
            printf("%d
    ",minn);
        }
        return 0;
    }
  • 相关阅读:
    通过TortoiseGit上传项目到GitHub
    删除右键菜单中的Git Gui Here、Git Bash Here的方法
    block functions区块函数插件的定义与使用
    modifiers标量调节器插件的定义和使用
    functions函数插件的定义和使用
    smarty内置函数、自定义函数
    smarty类与对象的赋值与使用
    Smarty模板的引用
    Smarty的循环
    Smarty的条件判断语句
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/6611429.html
Copyright © 2011-2022 走看看