-1

如何排列列表 A 以使列表 A 的最大元素数大于另一个列表 B?

例子:

A='3 6 7 5 3 5 6 2 9 1' 
B='2 7 0 9 3 6 0 6 2 6'

answer=7 .....如果我对列表进行排序,

      sListA = [1, 2, 3, 3, 5, 5, 6, 6, 7, 9]
      sListB = [0, 0, 2, 2, 3, 6, 6, 6, 7, 9]
#if sListA[i]>sListB[j]: count +=1

有5个实例 sListA[i] > sListB[j]

但我们需要最大化 sListA[i] > sListB[j].. 的实例,即 7

如果 sListA 是[1, 2, 3, 3, 5, 7, 9, 5, 6, 6]

和 slistB 是[0, 0, 2, 2, 3, 6, 6, 6, 7, 9]

那么7个实例sListA[i] > sListB[j]将是可能的..

这是我的代码:

 def main():
        listA=list(map(int,A.rstrip().split()))
        listB=list(map(int,B.rstrip().split()))
        sListA=sorted(listA)
        sListB=sorted(listB)
        count=0
        for (i,j) in map(sListA,sListB):
            if sListA[i]>sListB[j]:
                count+=1
        print(count)         
    main()

但这仅从排序列表中计算,我需要找到一种方法将元素与 sListA 中的下一个最大元素交换,sListA[i]<sListB[j] 以最大化 sListA[i]>sListB[j] 的实例

4

2 回答 2

2

也许不是最有效的,但你可以试试

a = [1, 2, 3, 3, 5, 5, 6, 6, 7, 9]
b = [0, 0, 2, 2, 3, 6, 6, 6, 7, 9]
b.sort()
a.sort()

new_a = []
for bb in b:
    idx_v = np.where(np.array(a) > bb)
    if idx_v[0].size == 0:
        break
    else:
        e = a.pop(np.min(idx_v[0]))
        new_a.append(e)
new_a.extend(a)

你会发现

np.sum([new_a[n] > b[n] for n in range(len(b))])

是 7,并且

new_a

[1、2、3、3、5、7、9、5、6、6]

于 2020-04-03T08:47:11.440 回答
1

所以理论上这应该做你想要的:

A='3 6 7 5 3 5 6 2 9 1' 
B='2 7 0 9 3 6 0 6 2 6'

def main():
    listA = sorted(list(map(int,A.rstrip().split())))
    listB = sorted(list(map(int,B.rstrip().split())))
    j = 0
    for i in range(len(listA)):
        if listA[i] <= listB[j]:
            i += 1
        else:
            listA[i], listA[j] = listA[j], listA[i]
            j += 1
    return listA
print(main())

回报:

[1, 2, 3, 3, 5, 7, 9, 6, 5, 6]

本质上,我所做的只是在else你的if结构中添加一个以保持i计数和交换元素listA


上一个答案(如果您对 7 的结果特别感兴趣):

A='3 6 7 5 3 5 6 2 9 1' 
B='2 7 0 9 3 6 0 6 2 6'
def main():
    listA = sorted(list(map(int,A.rstrip().split())))
    listB = sorted(list(map(int,B.rstrip().split())))
    cnt = 0
    j = 0
    for i in range(len(listA)):
        if listA[i] > listB[j]:
            cnt += 1
            j += 1
        else:
            i += 1
    return cnt
print(main())

要对 A 和 B 的多个列表执行此操作,可以尝试应用以下内容:

Alist=['3 6 7 5 3 5 6 2 9 1', '9 5 3 1 0']
Blist=['2 7 0 9 3 6 0 6 2 6', '5 4 3 4 6']

def main():
    cnt = 0
    for x in range(len(Alist)):
        listA = sorted(list(map(int,Alist[x].rstrip().split())))
        listB = sorted(list(map(int,Blist[x].rstrip().split())))
        j = 0
        for i in range(len(listA)):
            if listA[i] > listB[j]:
                cnt += 1
                j += 1
            else:
                i += 1
    return cnt
print(main())
于 2020-04-03T08:35:48.477 回答