Challenge: Lazy Sorting

Subdomeniu: Probability (probability)

Scor cont: 30.0 / 30

Submission status: Accepted

Submission score: 1.0

Submission ID: 464726194

Limbaj: python3

Link challenge: https://www.hackerrank.com/challenges/lazy-sorting/problem

Cerinta

Logan is cleaning his apartment. In particular, he must sort his old favorite sequence, $P$, of $N$ positive integers in nondecreasing order. He's tired from a long day, so he invented an easy way (in his opinion) to do this job. His algorithm can be described by the following pseudocode:

    while isNotSorted(P) do {	
        WaitOneMinute();
        RandomShuffle(P)
    }

Can you determine the expected number of minutes that Logan will spend waiting for $P$ to be sorted?

Input Format

The first line contains a single integer, $N$, denoting the size of permutation $P$.		
The second line contains $N$ space-separated integers describing the respective elements in the sequence's current order, $P_0, P_1, \ldots, P_{N-1}$.

Output Format

Print the expected number of minutes Logan must wait for $P$ to be sorted, correct to  $6$ decimal places.

Constraints

- $2 \le N \le 18$
- $1 \le P_i \le 100$

Cod sursa

#!/bin/python3

import math
import os
import random
import re
import sys

def solve(P):

    if P == sorted(P):
        return 0
        
    counts = [P.count(i) for i in list(set(P))]
    n_perm_w_repetitions = int(math.factorial(len(P))/math.factorial(counts[0]))
    for c in counts[1:]:
        n_perm_w_repetitions = int(n_perm_w_repetitions/math.factorial(c))
    ev = n_perm_w_repetitions
    return "%.6f" % round(ev)
if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    P_count = int(input().strip())

    P = list(map(int, input().rstrip().split()))

    result = solve(P)

    fptr.write(str(result) + '\n')

    fptr.close()
HackerRank Probability – Lazy Sorting