此题链接单击这里
=================
题意:
有N个数,每次只能和相邻的数交换,只能交换K次,问最少有多少个逆序对(就 是一个数前面有多少个数比它大)。
思路:
用归并排序按升序排列,在排列时记录所有的逆序对。排列完以后用所有的逆序对减K就是行了(注意负数时输出0)
付代码
#include <iostream>
#include <cstdio>
#include <queue>
#include <stack>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
long long a[110000];
long long b[110000];
long n;
long long cnt;
long long l;
long long k;
void funt(long x,long y)
{
if(y-x>1){
long m=x+(y-x)/2;
long p=x,q=m,i=x;
funt(x,m);
funt(m,y);
while(p<m||q<y)
{
if(q>=y||(p<m&&a[p]<=a[q]))
b[i++]=a[p++];
else
{
b[i++]=a[q++];
cnt+=m-p;
}
}
for(i=x;i<y;i++)
a[i]=b[i];
}
}
int main()
{
while(scanf("%ld%lld",&n,&k)==2)
{
cnt=0;
memset(b,0,sizeof(b));
for(long i=0;i<n;i++)
scanf("%lld",&a[i]);
funt(0,n);
if(cnt>k)
printf("%lld\n",cnt-k);
else
cout<<0<<endl;
}
}
有问题联系企鹅791267032
邮箱地址….wutanrong@Hotmail.com