乘坐保密电梯 python

本文介绍了一道涉及递归和创新算法的编程题目,要求对一组随机生成的楼层进行排序,限制条件包括组合交换和最大初始化。作者给出了Python代码实现,展示了如何使用组合、排序和删除操作来解决这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 难度指数:⭐⭐⭐⭐⭐

知识点:递归

耗时:12h

通用一般算法:

【华为OD机试真题2023B卷 JAVA&JS】乘坐保密电梯

创新算法

idea:最大初始化+组合交换

        类似的还有:篮球比赛python

代码实现

import random
from itertools import combinations

def best_ranking(floors, F, N):
    def re_ranking(floors0):
        print(floors0)
        floors_r=[]
        for i in range(N2 - 1):
            floors_r.append(floors0[i])
            floors_r.append(floors0[N2 + i])
        floors_r.append(floors0[N2 - 1])
        if len(floors_r) != N:  floors_r.append(floors0[N-1])
        return floors_r 
    
    def generate_ij(floors, min_m):
        i0, j0 = [], []
        for k in range(1, N - N2 + 1):
            s1 = list(combinations(floors[0 : N2], k))
            s2 = list(combinations(floors[N2:], k))
            for i in s1:
                for j in s2:
                    temp = 2 * (sum(i) - sum(j)) - max_m
                    if temp == 0: 
                        print(0)
                        return list(i), list(j)
                    if 0 < temp < min_m :
                        min_m = temp
                        i0, j0 = i, j
        print(min_m)
        return list(i0), list(j0)
    
    def remove_ij(s, i0):
        s0 = []
        i = 0
        for j in range(len(s)):
                if i >= len(i0) or i0[i] != s[j]:
                    s0.append(s[j])
                if i >= len(i0) or i0[i] == s[j]:
                        i+=1
        return s0

    if N == 1: return floors
    N2 = (N + 1) // 2
    max_m = sum(floors[0 : N2]) - sum(floors[N2 : ]) -F
    if max_m <= 0: return re_ranking(floors)
    min_m = max_m
    i0, j0 = generate_ij(floors, min_m)
    i0 = sorted(i0, reverse =  True)
    j0 = sorted(j0, reverse =  True)
    res0 = remove_ij(floors[0 : N2], i0)
    res1 = remove_ij(floors[N2 : ], j0)
    print(i0, j0, res0, res1)
    return re_ranking(sorted(res0 + j0, reverse = True) + sorted(i0 + res1, reverse = True))
    
T = 1
while T:
    if(1):
        F, N = random.randint(1,50), random.randint(1,23)
        floors = [random.randint(1,50) for _ in range(N)]
        print(F, N)
        print(floors)
    else:
        F, N = 26, 10
        floors = [40, 42, 11, 23, 23, 26, 11, 38, 7, 1]
    floors = sorted(floors, reverse = True)
    br = best_ranking(floors, F, N)
    print(floors, '\n', br)
    T -= 1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值