HDU 1394

题意:给定一串数字的个数n,输入这串数字(每个数字都是从0到n-1不重复)。每次可以把这串数字的前边几个数平移到末尾。问所有情况下此串最少存在多少对逆序数。

做线段树专题的时候找到这道题。一开始各种不懂(屌丝第一次明白什么是逆序数)。后来看了大神的博客之后明白了怎么搞平移。但是最终还是决定写暴力了。

#include<iostream>
#include<stdio.h>
using namespace std;
int min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
int main()
{
    int tmp[5005],sum,n,i,j,ans;
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&tmp[i]);
            tmp[i]++;
            for(j=0;j<i;j++)
            {
                if(tmp[j]>tmp[i])
                    sum++;
            }
        }
        ans=sum;
        for(i=0;i<n;i++)
        {
            sum+=(n-tmp[i]);//每次平移增加的对数
            sum-=(tmp[i]-1);//减小的对数
            ans=min(sum,ans);?//取最小值
        }
        printf("%d
",ans);
    }
}
原文地址:https://www.cnblogs.com/tun117/p/4523974.html