zoukankan      html  css  js  c++  java
  • 数列还原(全排列)

    题目描述

    牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。

    输入描述:

    每个输入包含一个测试用例。每个测试用例的第一行包含两个整数 n 和 k(1 <= n <= 100, 0 <= k <= 1000000000),接下来的 1 行,包含 n 个数字表示排列 A,其中等于0的项表示看不清的位置(不超过 10 个)。

    输出描述:

    输出一行表示合法的排列数目。

     

    示例1

    输入

    5 5

    4 0 0 2 0

    输出

    2

    分析:

      遍历出缺少的数字,统计缺少的数字所有的排列组合。将每一种排列组合按顺序插入原数组中,然后统计顺序对,如果顺序对符合要求,则题目所求合法排列数加1

      这道题值得思考的地方是全排列

    def getMissData(nums):
        res = [0]*(len(nums)+1)
        for i in nums:
            res[i] = 1
        ans = []
        for i in range(1,len(res)):
            if res[i] == 0:
                ans.append(i)
        return ans
    def getPermutation(nums,i,n,perm):
        if i == n:
            perm.append(nums)
        for j in range(i,n):
            tmp = nums[:]
            tmp[i],tmp[j] = tmp[j],tmp[i]
            getPermutation(tmp,i+1,n,perm)
    def getCntPair(nums):
        cnt = 0
        for i in range(len(nums)):
            for j in range(0,i):
                if nums[j] < nums[i]:
                    cnt += 1
        return cnt
    n,k = map(int,raw_input().strip().split())
    nums = map(int,raw_input().strip().split())
    missData = getMissData(nums)
    perms = []
    getPermutation(missData,0,len(missData),perms)
    cnt = 0
    ans = 0
    for perm in perms:
        idx = 0
        tmp = nums[:]
        for i in range(len(tmp)):
            if tmp[i] == 0:
                tmp[i] = perm[idx]
                idx += 1
        cnt = getCntPair(tmp)
        if cnt == k:
            ans += 1
    print(ans)    
  • 相关阅读:
    Mybatis简单的入门之增删改查
    循环的角度求均值
    谈谈软件设计
    秒杀多线程第四篇 一个经典的多线程同步问题
    (转)dp动态规划分类详解
    P1006 传纸条
    P1005 矩阵取数游戏
    1D1D动态规划优化
    NOI 2009A 诗人小G
    P1078 文化之旅
  • 原文地址:https://www.cnblogs.com/Peyton-Li/p/7576223.html
Copyright © 2011-2022 走看看