HDU 1394 Minimum Inversion Number(循环数组求逆序数)(暴力,归并排序,线段树)
原创
©著作权归作者所有:来自51CTO博客作者mb62ea10deefd92的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目地址:点击打开链接
思路:让一个数组不断把第一个数放到最后面,求最小的逆序数
关于逆序数的概念举一个例子 3 2 5 1 4
3后面比3小的有2个
2后面比2小的有1个
5后面比5小的有2个
1后面比1小的没有
4后面比4小的没有
至于如何求循环数组的最小逆序数,能根据第一个的逆序数算出来,假设数组原始的逆序数已经算出来为temp,则把第一个数放到最后面逆序数会少a[0]个(0到a[0]-1),会多n-1-a[0]个(a[0]+1到n-1),关于逆序数的变种挺多的
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
typedef long long ll;
using namespace std;
int a[5010];
int main()
{
int i,j;
int n;
while(scanf("%d",&n) != EOF)
{
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
int sum = 0;
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
if(a[i] > a[j])
{
sum++;
}
}
}
int min1 = sum;
for(i=0; i<n; i++)
{
sum = sum - a[i] + n - 1 - a[i];
if(sum < min1)
min1 = sum;
}
printf("%d\n",min1);
}
}
AC代码2:归并排序,其中merge1函数里面的可以每次开一个临时数组,到最后释放即可
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
typedef long long ll;
using namespace std;
int a[5010];
int cf[5010];//也可以每次在merge1函数里面每次开一个数组,这样比较省内存
int lol[5010];
int sum;
void merge1(int b,int e)
{
int i = b;
int mid = (b + e) / 2;
int j = mid + 1;
int temp = b;
while(i <= mid && j <= e)
{
if(a[i] <= a[j])
{
cf[temp++] = a[i];
i++;
}
else
{
cf[temp++] = a[j];
j++;
sum += mid - i + 1;//i到mid都比这个数大
}
}
while(i <= mid)
{
cf[temp++] = a[i];
i++;
}
while(j <= e)
{
cf[temp++] = a[j];
j++;
}
for(i=b; i<=e; i++)
{
a[i] = cf[i];
}
}
void merge_sort(int b,int e)
{
if(b < e)
{
int mid = (b + e) / 2;
merge_sort(b,mid);
merge_sort(mid+1,e);
merge1(b,e);
}
}
int main()
{
int i;
int n;
while(scanf("%d",&n) != EOF)
{
sum = 0;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
lol[i] = a[i];
}
merge_sort(0,n-1);
int min1 = sum;
for(i=0; i<n; i++)
{
sum = sum - lol[i] + n - 1 - lol[i];
if(sum < min1)
min1 = sum;
}
printf("%d\n",min1);
}
}