题意:给定一串数字的个数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); } }