2013-06-12 1 views
-2

http://www.codechef.com/problems/LEBOBBLE버블 정렬이 수행 할 스왑 횟수를 어떻게 계산할 수 있습니까? n 개의 정수의 배열 A의 정렬

버블은 다음과 같은 방식으로 작동합니다 : 당신은 n 개의 정수의 배열 B 주어진다

var int i, j; 
for i from n downto 1 
{ 
    for j from 1 to i-1 
    { 
    if (A[j] > A[j+1]) 
    swap(A[j], A[j+1]) 
    } 
} 

. 이어서 어레이 A는 다음과 같이 어레이 B를 사용하여 생성된다

: 각각 I (1 < = 1 < = N)에 대한 우리는 달리 아이 = 양방향 확률 파이로 아이 = 양방향 + D를 설정. Little Elephant가 배열 A가 위 버블 정렬 알고리즘으로 정렬 될 때 버블 정렬이 할 것으로 예상되는 스왑 수를 찾으십시오. 입력

입력의 첫 번째 줄에는 단일 정수 T - 테스트 사례의 수를 포함합니다. T 테스트 케이스는 다음과 같습니다. 각 테스트 케이스의 첫 번째 줄에는 정수 n과 d의 쌍이 들어 있습니다. 각 테스트 케이스의 다음 줄에는 n 개의 정수 - 배열 B가 포함됩니다. 다음 줄에는 n 개의 정수 - 배열 P가 포함됩니다. 출력 T 행에는 T 실수가 인쇄됩니다. 모든 숫자를 소수점 4 자리로 정확하게 반올림하십시오. 제약

1 <= T <= 5 
1 <= n <= 50000 
1 <= Bi, d <= 10^9 
0 <= Pi, <= 100 
Example 

Input: 
2 
2 7 
4 7 
50 50 
4 7 
5 6 1 7 
25 74 47 99 

Output: 
0.2500 
1.6049 

당신이 접근하는 방법에 대한 힌트가 있습니까?

+0

스택 오버플로에 오신 것을 환영합니다. 지금까지해온 일의 샘플을 제공하고 정확한 문제와 관련된 특정 질문을하면 문제에 대한 도움을 얻을 수있는 더 나은 기회를 얻게됩니다. – Maciej

+0

명확히하기 위해 특정 입력에 필요한 스왑 수 또는 평균 스왑 수 (계산 복잡성)를 찾으려고합니다. – ChrisCM

+4

제목은 desaster입니다 ... –

답변

2

힌트 - 버블 정렬에서 만들어진 스왑의 수는 배열의 inversions 수와 같습니다. 시간의 배열에서 역전의 수를 계산하는 유명한 divide-and-conquer 알고리즘이 있습니다. O (n log n) - 이것을 수행하는 방법을 알아낼 수 있습니까?

희망이 도움이됩니다.

관련 문제