题解 | 小苯的刷怪笼

小苯的刷怪笼

https://www.nowcoder.com/practice/cebdd96f85b044fcaed27cfe8030a9ed

def solve():
    import sys
    # 读取输入:兼容多空格/换行分隔的输入格式,拆分后转为列表
    input = sys.stdin.read().split()
    n = int(input[0])  # 目标构造数组的长度
    a = int(input[1])  # 核心约束参数1
    k = int(input[2])  # 核心约束参数2(需要满足范围限制)
    
    # 处理n=1的特殊边界情况
    if n == 1:
        # 数组长度为1时,仅当a等于k时合法,输出a;否则无解输出-1
        if a == k:
            print(a)
        else:
            print(-1)
        return
    
    # 计算k的合法取值范围:超出范围则无法构造数组,输出-1
    mini = (a + 1) // 2  # k的最小值(整数除法,对应C++的(a+1)/2截断规则)
    maxi = a - n // 2    # k的最大值(n//2是n除以2的整数部分)
    # 检查k是否在[mini, maxi]范围内,超出则输出-1
    if k > maxi or k < mini:
        print(-1)
        return
    
    # 初始化数组最后两个元素的初始值
    lf = 1  # 倒数第二个元素的初始值
    # 位运算n&1:判断n的奇偶性(奇数结果为1,偶数结果为0)
    # rt初始值:n为奇数时rt=0,n为偶数时rt=1
    rt = 1 - (n & 1)
    
    # 调整k和a的数值,适配后续计算规则
    k -= n // 2   # k减去n的半长(整数部分)
    a -= (n // 2) * 2  # a减去2倍的n半长(保证a为偶数/奇数适配)
    
    # 计算数组最后两个元素的最终值
    lf += a - k  # 倒数第二个元素的最终值
    rt += k      # 最后一个元素的最终值
    
    # 构造输出结果列表:避免多次print的IO开销,先收集再拼接
    output = []
    # 前n-2个元素固定为"1"(数组长度>2时生效,长度=2时无此部分)
    # range(2, n):遍历从2到n-1(左闭右开),共n-2个元素
    for i in range(2, n):
        output.append("1")
    # 添加最后两个元素(lf和rt)
    output.append(str(lf))
    output.append(str(rt))
    
    # 拼接所有元素为字符串,空格分隔输出
    print(' '.join(output))

# 程序入口:仅当脚本直接运行时执行solve函数
if __name__ == "__main__":
    solve()

全部评论

相关推荐

12-24 20:49
武汉大学 Java
点赞 评论 收藏
分享
11-10 21:00
门头沟学院 Java
程序员牛肉:没啥必要了,3月末就开暑期实习了,你现在找还不一定能找到。看你啥学历了。 双非基本代表想进好公司无望了。211的话,现在继续沉淀,零日常实习参加暑期其实也压力不太大
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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