本问题中,你将分析一个特殊的排序算法。该算法对n个不相同整数的形成的序列,通过不断交换两个相邻元
素,直至形成升序排列。对于输入序列
9 1 0 5 4
Ultra-QuickSort的输出是
0 1 4 5 9
你的任务是:对于给出的一个整数序列,计算Ultra-QuickSort需要执行多少次交换操作。
输入
输入包括多个测试用例。每一个测试用例以单个整数n< 500,000开始,n表示输入序列的长度。n后面每一行
包含单个整数a[i],0 ≤ a[i] ≤ 999,999,999,是序列中的第i个元素。输入由n=0(n所在行输入0)结束
,n=0的序列不必处理。
输出
对每一个输入序列,程序应该输出1行,该行包含1个整数,表示对给定序列排序所需要交换操作的次数。
样例输入
5
9 1 0 5 4
3
1 2 3
0
样例输出
6
素,直至形成升序排列。对于输入序列
9 1 0 5 4
Ultra-QuickSort的输出是
0 1 4 5 9
你的任务是:对于给出的一个整数序列,计算Ultra-QuickSort需要执行多少次交换操作。
输入
输入包括多个测试用例。每一个测试用例以单个整数n< 500,000开始,n表示输入序列的长度。n后面每一行
包含单个整数a[i],0 ≤ a[i] ≤ 999,999,999,是序列中的第i个元素。输入由n=0(n所在行输入0)结束
,n=0的序列不必处理。
输出
对每一个输入序列,程序应该输出1行,该行包含1个整数,表示对给定序列排序所需要交换操作的次数。
样例输入
5
9 1 0 5 4
3
1 2 3
0
样例输出
6
0
( 动态规划 状态转移方程dp[i] = dp[j] + 1 )
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
int num[500000];
int dp[500000];
int n;
_int64 cnt = 0;
int main()
{
int i,j;
while(1)
{
scanf("%d",&n);
if(!n) break;
for(i = 0;i < n;i++)
{
scanf("%d",&num[i]);
if(i)
{
for(j = i-1;j >= 0;j--)
{
if(num[i] < num[j])
{
dp[i] = dp[j] + 1;
cnt += dp[i];
break;
}
}
}
}
printf("%I64d\n",cnt);
}
//system("pause");
return 0;
}