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