数列还原-python

题目描述

牛牛的作业薄上有一个长度为 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,牛客网上的程序

#判断是否符合顺序对,符合返回1,否则返回0.
def calc_count(l,k):
    t = 0
    for i in range(len(l)-1):
        for j in range(i+1,len(l)):           
            if l[i] < l[j]:
                t += 1  
    return 1 if t == int(k) else 0
#获取输入的数列
n,k = input().split()
A = list(map(int,input().split()))
#初始化
t = []
pos = []
count = 0
#取出缺失值存在t,缺失值的位置存在pos
for x in range(1,int(n)+1):
    if not x in A:
        t.append(x)
    if A[x-1] == 0:
        pos.append(x-1)
#判断特殊情况,就一个缺失值
if len(t) == 1:
    A_temp = A
    A_temp[pos[0]] = t[0]
    count += calc_count(A_temp,k)
else:
    for i in range(len(t)):
        for j in range(len(t)-1):
            t[j],t[j+1] = t[j+1],t[j]   #缺失值的全排列
            A_temp = A
            for index,item in enumerate(pos):
                A_temp[item] = t[index]  #把缺失值放到原来的数列中进行顺序对的判断
            count += calc_count(A_temp,k)
print(count)

2 自己写的(但是只有80%的通过率,望大佬指正,在下面留言改正错误)

def cacu(n,k,lst):
    t = []
    pos = []
    count = 0
    for x in range(1,int(n)+1):
        if not x in lst:
            t.append(x)
        if lst[x-1] == 0:
            pos.append(x-1)
    chajipailie=perm(t)
    A_temp = lst
    for i in chajipailie:
        for index,item in enumerate(pos):
            A_temp[item] = i[index]
            count += calc_count(A_temp,k)
    return count
            
def calc_count(l,k):
    t = 0
    for i in range(len(l)-1):
        for j in range(i+1,len(l)):           
            if l[i] < l[j]:
                t += 1  
    return 1 if t == int(k) else 0

def perm(l):
    if(len(l)<=1):
        return [l]
    r=[]
    for i in range(len(l)):
        s=l[:i]+l[i+1:]
        p=perm(s)
        for x in p:
            r.append(l[i:i+1]+x)
    return r

n,k=input().split()
lst=list(map(int,input().split()))
print(cacu(n,k,lst))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值