思路:两层for循环,一定会超时的,这个题可以归并排序做,大家可以上网查看一下,也可以用
C++里面的向量函数做(代码很简单;下面是两种不同的方法,大家可以看一下;vector 方法:
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 50010
int num[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
vector<int>Q;
int cont=0;
for(int i=0; i<n; i++)
{
scanf("%d",&num[i]);
cont+=Q.end()-upper_bound(Q.begin(),Q.end(),num[i]);
Q.insert(upper_bound(Q.begin(), Q.end(),num[i]),num[i]);
}
printf("%d\n",cont);
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define maxn 500010
int num[maxn];
int v[maxn];
int cont;
void merge(int a[],int b[],int left,int mid,int right)
{
int i=left;
int j=mid+1;
int term=i;
while(i<=mid&&j<=right)
if(a[i]>a[j])
{
cont+=mid-i+1;
b[term++]=a[j++];
}
else b[term++]=a[i++];
while(i<=mid)
b[term++]=a[i++];
while(j<=right)
b[term++]=a[j++];
return ;
}
void dfs(int a[],int b[],int left,int right)
{
if(left==right)
return ;
int mid=(left+right)/2;
dfs(b,a,left,mid);
dfs(b,a,mid+1,right);
merge(a,b,left,mid,right);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
cont=0;
for(int i=0; i<n; i++)
{
scanf("%d",&num[i]);
v[i]=num[i];
}
dfs(num,v,0,n-1);
printf("%d\n",cont);
}
return 0;
}