数列还原(全排列)

题目描述

牛牛的作业薄上有一个长度为 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)    

 

转载于:https://www.cnblogs.com/Peyton-Li/p/7576223.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值