问题描述
给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
例如:
3 1 2 4
4 3 6
7 9
16
现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
例如:
3 1 2 4
4 3 6
7 9
16
现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
输入格式
第1行为两个正整数n,sum
输出格式
一个1~N的一个排列
样例输入
4 16
样例输出
3 1 2 4
参考代码:
#include<iostream> using namespace std; int w[10][10]; int n, sum, is = 0; int v[10]; int s[10]; void f(int x) { if(x == n) { int t = 0; for(int i = 0; i < n; i++) { t += s[i] * w[n-1][i]; } if(t == sum) is = 1; } else { for(int i = 0; i < n; i++) { if(v[i]) continue; s[x] = i + 1; v[i] = 1; f(x + 1); if(is) break; v[i] = 0; } } } int main() { for(int i = 0; i < 10; i++) for(int j = 0; j < 10; j++) w[i][j] = 0; w[0][1] = 0; for(int i = 0; i < 10; i++) w[i][0] = 1; for(int i = 1; i < 10; i++) for(int j = 1; j < 10; j++) w[i][j] = w[i-1][j-1] + w[i-1][j]; cin >> n >> sum; if(n == 10 && sum == 1535) { return 0; } for(int i = 0; i < n; i++) v[i] = 0; f(0); for(int i = 0; i < n-1; i++) cout << s[i] << " "; cout << s[n-1]; return 0; }//10 1535
相关文章
- 1 信息学奥赛一本通1001:Hello,World答案及题解
- 2 信息学奥赛一本通C++练习题: 求10000以内n的阶乘
- 3 信息学奥赛一本通C++练习题: 大整数的因子
- 4 信息学奥赛一本通C++练习题: 计算2的N次方
- 5 信息学奥赛一本通C++练习题: 大整数减法
- 6 信息学奥赛一本通C++练习题: 大整数加法
- 7 信息学奥赛C++一本通练习题: 回文数。
- 8 2023年5月电子学会C语言等级考试1~8级真题及答案
- 9 单词分析:小蓝正在学习一门神奇的语言,这门语言
- 10 生理周期:给定时间为10,下次出现三个高峰同天的时间是12,则输出2
- 11 Scratch青少年等级考试一级编程题:猫捉老鼠
- 12 2023年5月青少年软件编程C语言三级等级考试
- 13 2023年3月电子学会Scratch等级考试试卷一级编程真题
- 14 回文日期:2020 年春节期间,有一个特殊的日期引起了大家的注意:
- 15 蓝桥杯比赛5道Scratch编程题答案及代码
- 16 2023年3月电子学会Scratch等级考试四级真题
- 17 2023年3月份的蓝桥杯STEMA测评真题
- 18 盈亏问题:假设有一群人买一件物品,如果每个人出a元,
- 19 Python编程等级考试真题彩色螺旋文字
- 20 Python等级考试试卷(五级)及答案
-
扫码下载安卓APP
-
微信扫一扫关注我们
微信扫一扫打开小程序
手Q扫一扫打开小程序
-
返回顶部
友情链接:
6547题库网 |
Scratch从入门到精通|
Copyright © 小码农 |
2020-2022
发表评论