题解 | 小芳的排列构造
小芳的排列构造
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()