Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

有这么一个游戏: 写出一个1~N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置。下面是一个例子:

3   1   2   4

4   3   6

7   9

16

最后得到16这样一个数字。 现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1~N的一个排列。若答案有多种可能,则输出字典序最小的那一个。

【输入格式】

输入文件bds.in的第1行为两个正整数n,sum。

【输出格式】

输出文件bds.out包括1行,为字典序最小的那个答案。

【数据规模】

对于40%的数据,n≤7; 对于80%的数据,n≤10; 对于100%的数据,n≤12,sum≤12345,且保证一定有解。

Sample Input1

 
4 16
 

Sample Output1

 
3 1 2 4

【题解】

从最下面往上推

a上面的b和c都会被加1次。

再往上则d会因为d+e=b 加1次。

e会因为d+e和e+f加2次。

f会因为e+f加一次。

所以d用了1次,e用了2次,f用了1次。

再往上。

g会因为g+h=d加一次

h会因为g+h加一次,还会因为h+i==e加两次。因为e被加了两次。

同理i因为h+i==e加了两次因为i+j==f加了一次。

j因为i+j==f加了一次。

综上g,h,i,j分别加了1,3,3,1次。

可以看出来是杨辉三角了。

知道了每个序列中的每一个元素最后会加几次。就不用一层一层地算下来了。

以后只要枚举完一个序列。直接用那些1,3,3,1这样的数字作为系数。乘上序列中的相应位置上的数字就可以了。

注意是1-n的全排列。

【代码】

#include <cstdio>
#include <cstring>
#include <stdlib.h>int n,sum;
int yanghui[20][20]= {0},what[20];
bool bo[20];void input_data()
{memset(bo,0,sizeof(bo)); //每个数字一开始都没有被用过。 scanf("%d%d",&n,&sum);yanghui[1][1] = 1;for (int i = 2;i <= n;i++) //处理出第n层的杨辉三角 for (int j = 1;j <= i;j++)yanghui[i][j] = yanghui[i-1][j-1]+yanghui[i-1][j];
}void sear_ch(int next,int now) //要找的下一个是next,当前累加的值为now
{if (now > sum) //如果大于sum了则剪枝 return;if (next == n+1) //如果找完n个数字则判断是否和sum相同。 {if (now == sum){for (int i = 1;i <=n-1;i++) //输出答案。 printf("%d ",what[i]);printf("%d",what[n]);    exit(0);}return;    }for (int i = 1;i <= n;i++) //继续枚举数字放在next的位置 if (!bo[i]) //没有用过 {bo[i] = true; //记录用过 what[next] = i; //记录用了什么数字 sear_ch(next+1,now+yanghui[n][next]*i);    //乘上相应的系数即可。 bo[i] = false;}
}void get_ans()
{for (int i = 1;i <= n;i++) i//这是第一个数字。 if (!bo[i])  {bo[i] = true; //记录i这个数字已经被使用过了。 what[1] = i; //记录这个位置放什么 sear_ch(2,yanghui[n][1]*i);//进入递归。 bo[i] = false;}
}int main()
{input_data();get_ans();return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7632332.html

【u107】数字游戏(bds)相关推荐

  1. 用法 stl_51Nod 2160 数字游戏 STL基本用法

    目录 目录 1. 题目描述 1.1. Limit 1.2. Problem Description 1.3. Input 1.4. Output 1.5. Sample Input 1.6. Samp ...

  2. [蓝桥杯]PREV-23.历届试题_数字游戏

    问题描述栋栋正在和同学们玩一个数字游戏.游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈.栋栋首先说出数字1.接下来,坐在栋栋左手边的同学要说下一个数字2.再下面的一个同学要从上一个同学说的数字往 ...

  3. C语言经典小游戏---猜数字游戏 (包含C语言中如何实现随机数的生成)

    题目描述:输入1-100之间的数字,进行猜数字游戏,猜大猜小有提示,直至才对为止,游戏可以重复游玩. 算法思路: 1.用void函数分别写出菜单程序与游戏进程程序. 2.用switch-case-de ...

  4. 例题3-4 猜数字游戏的提示(Master-Mind Hints, UVa 340)

    实现一个经典"猜数字"游戏.给定答案序列和用户猜的序列,统计有多少数字位置正确 (A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据.每组输入第一行为序列长度n ...

  5. c语言猜数字游戏用while,【C语言基础】有趣的猜数字游戏。(while循环,if语句,switch语句)...

    要求:猜数字游戏的实现.代码如下:#include #include #include void menu() { printf("***************************** ...

  6. python猜年龄代码_python入门教程NO.7用python来写一个猜数字游戏

    python入门教程 本文涉及的python基础语法为while循环 #python#3中while语句常常被用于循环执行某个程序,任何非0和非空null的值,都会被条件判断为True while 条 ...

  7. Go-实现猜数字游戏代码

    实现猜数字游戏代码 1 package main 2 3 import ( 4 "fmt" 5 "math/rand" 6 "time" 7 ...

  8. 挣值管理不是搞数字游戏

    摘要: 要考PMP(Project Management Professional ),挣值管理是必考的知识.软件项目有很大的特殊性,不少人认为挣值管理不太适用于软件项目.挣值管理相关资料也比较超多, ...

  9. python猜数字游戏简单-python猜数字游戏快速求解解决方案

    python猜数字游戏快速求解解决方案.使用方法: 1. 保存代码为guessall.py 2. 执行python guessall.py > result.txt 3. 打开result.tx ...

最新文章

  1. mysql 指定日期条件求和_如何在mysql中按每个日期对字段进行求和-问答-阿里云开发者社区-阿里云...
  2. 安装CDH5时出错 5.68.168.192.in-addr.arpa domain name pointer bogon.
  3. 如何解决java.lang.NoClassDefFoundError:Java 9中的javax / xml / bind / JAXBException
  4. linux centos yum 报错 获取GPG密钥失败 Errno 14
  5. python3遍历技巧
  6. python怎么用圆周率_Python语言中,如何使用圆周率?
  7. 对于防止按钮重复点击的尝试
  8. 安卓开发笔记——探索EventBus(转)
  9. 即时通讯WebSocket
  10. linux查询打印机ip,Linux C打印IP地址信息
  11. [转载] 晓说——第25期:看美国系列之“两极分化的黑人”
  12. 电脑配置单3(自用勿删)
  13. 模具怎么报价?快速报价的计算方法
  14. 2019年机器学习/ 深度学习热门论文集锦
  15. Tobii pro lab学习笔记1
  16. SQL之数据定义、数据操纵
  17. 失联客机大致位置确认 美军水下航行器展开搜寻
  18. Windows server 2012R2或Windows 8.1如何成功离线安装.net 4.7
  19. 【JVM】JVM浅尝辄止
  20. [转帖]希捷硬盘的命名规范

热门文章

  1. 微型计算机电路基础第四版逻辑门,数字逻辑的电路基础——逻辑门.PDF
  2. Python MD5
  3. Java Spring AspectJ
  4. mysql数据库密码为空_注意MySQL 数据库用户root密码为空_MySQL
  5. Nginx学习总结(10)——Nginx前后端分离将多个请求转发到多个Tomcat,负载均衡反向代理
  6. axi dma 寄存器配置_STM32 ADC多通道转换的DMA传输示例
  7. 消息中间件 rabbitMQ
  8. There is no more space for virtual disk .vmdk.
  9. python学习之老男孩python全栈第九期_day009之初始函数初窥
  10. 洞察CRM对企业的真正价值