FOJ2166 inversion
来源:互联网 发布:2016下半年的网络综艺 编辑:程序博客网 时间:2024/04/30 13:56
题意:给一个整数序列,求交换某两个数或者不交换能得到的最小的逆序数对数。
预处理每个位置到它前面的任意一个位置间比它大的数和小的数的个数,和到它后面的任意一个位置间比它大的数和小的数的个数。然后枚举任意两个位置就可以了。
#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
int qx[1003][1003],hx[1003][1003],qd[1003][1003],hd[1003][1003];
int a[1003],n;
void init()
{
int i,j;
for(i=0;i<=n-3;i++)
{
int tmpx=0,tmpd=0;
for(j=i+1;j<=n-2;j++)
{
if(a[j]<a[i])tmpx++;
qx[i][j+1]=tmpx;
if(a[j]>a[i])tmpd++;
qd[i][j+1]=tmpd;
}
}
for(i=n-1;i>=2;i--)
{
int tmpx=0,tmpd=0;
for(j=i-1;j>=1;j--)
{
if(a[j]<a[i])tmpx++;
hx[i][j-1]=tmpx;
if(a[j]>a[i])tmpd++;
hd[i][j-1]=tmpd;
}
}
}
int main()
{
int i,j,num;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)scanf("%d",&a[i]);
memset(qx,0,sizeof(qx));
memset(qd,0,sizeof(qd));
memset(hx,0,sizeof(hx));
memset(hd,0,sizeof(hd));
init();
num=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])num++;
}
}
int min=1000000;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
int tmp=qd[i][j]-qx[i][j]+hx[j][i]-hd[j][i];
if(a[i]<a[j])tmp++;
if(a[i]>a[j])tmp--;
if(tmp<min)min=tmp;
}
}
if(min<0)num+=min;
printf("%d\n",num);
}
return 0;
}
- FOJ2166 inversion
- inversion
- Inversion
- Inversion
- zoj1201--------Inversion
- count inversion
- HDU4911-Inversion
- HDU4911:Inversion
- mobius inversion
- priority inversion
- hdu5497 Inversion
- hdu4911 Inversion
- sduacmDiv1-Inversion
- HDU6098 Inversion
- HDU6098(Inversion)
- HDU6098-Inversion
- HDU6098 Inversion
- HDU6098-Inversion
- MKNetworkKit与AFNetworking和ASIHTTPRequest,MKNetworkKit用法与介绍
- 传说中的CSS~让我来告诉你吧~Cascading Style Sheets
- leetcode-Reverse Words in a String
- Android 利用seekbar结合AudioManager调节系统音量
- MyBatis映射文件的resultMap如何做表关联
- FOJ2166 inversion
- Ubuntu 14.04 创建无线接入点供移动设备连接上网
- C++基础之引用(常人有误区)
- 关于lua coroutine
- php删除数组指定元素
- 关于Highcharts图表组件动态修改属性的方法(API)总结之Axis
- qq 能上但是打不开网页
- Java中对日期的注意点
- nio中selectkey,selector的作用