hdu1394

链接:点击打开链接

题意:给出n个数,范围为0

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[5005];
int main(){
    int n,i,j,sum,temp;
    while(scanf("%d",&n)!=EOF){
        sum=0;
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        for(i=0;i<n;i++){
            for(j=i+1;j<n;j++)
            if(a[i]>a[j])
            sum++;
        }
        temp=sum;
        for(i=0;i<n;i++){
            temp=temp-a[i]+(n-1-a[i]);      //当第一个数移动到最后时,后面比这个数大的为
            sum=min(sum,temp);              //n-1-a[i]个,所以移动后逆序数为减去a[i]加上
        }                                   //n-1-a[i].因为这题为0~n-1,要不然应该是减去
        printf("%d\n",sum);                 //那一位的逆序数,再加上n-1-那一位的逆序数
    }
    return 0;
}


~n-1,依次将队首的数换到队尾,一个循环后,求变换过程中逆序数最小为多少

 

代码:

你可能感兴趣的:(hdu1394)