问题描述:
给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
例如:
3 1 2 4
4 3 6
7 9
16
现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
输入格式:
第1行为两个正整数n,sum 例如(4 16)
输出格式:
一个1~N的一个排列 例如(3 1 2 4)
这道题是一道简单的搜索题,需要注意的是要记住用dfs书写排列组合的模板,以及如何操作数组
![](https://i-blog.csdnimg.cn/blog_migrate/7902a0b3ae171e24611eea4a8bbd31d7.png)
import sys
def fun(s): # fun数组用于操作数组,求出题目要求的和
while len(s) != 1:
for i in range(0,len(s)-1):
s[i] = s[i]+s[i+1]
s.pop(len(s)-1)
return s[0]
def dfs(s,t): # 这里就是一个dfs书写排列的模板
if s == t:
if fun(b[0:s]) == sum:
for i in range(s):
print(b[i],end=' ')
sys.exit(0) # 找到答案就退出程序
else:
for i in range(t):
if vis[i] == 0:
vis[i] = 1
b[s] = a[i]
dfs(s+1,t)
vis[i] = 0 # 模板的解释见上流程图
n,sum = map(int,input().split())
a = [1,2,3,4,5,6,7,8,9,10]
b = [0]*10 # b数组用于记录新产生的组合
vis = [0] * 10 # vis用于记录使用
dfs(0,n)
这道题蓝桥oj上有一个测试超时了,我点进去看输出和输入都没有。本人新手初学数据结构,后面希望加油啦