1406 逆序对

来源:互联网 发布:linux开启8080端口 编辑:程序博客网 时间:2024/06/05 04:19
 
描述

A[1..n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i]>A[j],则(i, j)就称为A中的一个逆序对。比如<2,3,8,6,1>5个逆序对:(2,1)(3,1)(8,6)(8,1)(6,1). 现在给出一个包含不同元素的数组,请你求出这个数组中逆序对的个数。(8)


输入

输入为n+1行。第一行为测试数据的组数n,以下的n行分别为n组测试数据。元素为int, 用空格隔开。

输出

输出为n行,分别对应n组测试数据中的逆序对的个数。

样例输入
22 3 8 6 11 2 3 4 5 6
样例输出
50
提示

每个结点增加一个域,维护当前比这个节点大的数的数目(右子树中元素的个数),即只要有元素插入到这个节点的右子树,这个域的值就增1. 剩下的工作请同学自己思考。

 

模拟题,用数组即可实现

#include <stdio.h>#include <string.h>char s[1000];main(){int number;int length,i,j;int p;int a[1000];int up;int temp;int count;scanf("%d",&number);getchar();while(number--){count=0;up=0;gets(s);length=strlen(s);i=0;p=0;for(i=0;i<length;i++){if(s[i]!=' '){p=0;while(s[i] >= '0' && s[i] <= '9'&&i<length){p = p * 10 + s[i] - '0';i++;}a[up++]=p;}elsecontinue;}for(i=0;i<up;i++)for(j=i+1;j<up;j++){if(a[i]>a[j])count++;}printf("%d\n",count);}}


 

原创粉丝点击