题解 | 小芳的排列构造

小芳的排列构造

https://www.nowcoder.com/practice/5e14876bd7aa4ad5953a1fa0cd804a79

def solve():
    import sys
    # 读取输入:兼容多空格/换行分隔的输入格式,拆分后转为列表
    input = sys.stdin.read().split()
    n = int(input[0])  # 目标构造数组的长度
    k = int(input[1])  # 需要满足的核心数值约束
    
    # 处理n=1的特殊边界情况
    if n == 1:
        # 仅当k=2时合法,输出1;否则无解输出-1
        if k != 2:
            print(-1)
            return
        print(1)
        return
    
    # 计算k的合法取值范围:超出范围则无解
    mini = n * 3 - 1  # k的最小值约束
    maxi = n * (n + 3) // 2  # k的最大值约束
    if k < mini or k > maxi:
        print(-1)
        return
    
    # 初始化标记数组:vis[i]表示数字i是否已被选入核心序列(索引0未使用,对应1~n)
    vis = [False] * (n + 1)
    k -= n * 2  # 调整k值,将原始k转换为贪心筛选的目标值
    
    res = []  # 存储贪心筛选出的核心序列
    # 贪心策略:从n-1倒序遍历,筛选需要优先加入的数字
    i = n - 1
    while k > 0:  # 直到k被消耗完为止
        if k >= i:
            k -= i  # 消耗k值
            res.append(i)  # 将当前数字加入核心序列
            vis[i] = True  # 标记为已使用
        i -= 1  # 倒序递减
    
    # 反转核心序列:恢复正序输出(因之前是倒序筛选)
    res.reverse()
    
    # 构造输出列表:避免多次IO,提升效率
    output = []
    # 第一步:加入核心序列
    for x in res:
        output.append(str(x))
    
    # 第二步:补充1~n-1中未被使用的数字
    for i in range(1, n):
        if not vis[i]:
            output.append(str(i))
    
    # 第三步:最后添加数字n(固定在数组末尾)
    output.append(str(n))
    
    # 拼接所有元素并输出
    print(' '.join(output))

# 程序入口
if __name__ == "__main__":
    solve()

全部评论

相关推荐

明天不下雨了:这个项目 这个简历 这个模板 莫不是一个开源的
点赞 评论 收藏
分享
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务