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;
}

【u107】数字游戏(bds)的更多相关文章

  1. C语言猜数字游戏

    猜数字游戏,各式各样的实现方式,我这边提供一个实现方式,希望可以帮到新手. 老程序猿就不要看了,黑呵呵 源代码1 include stdio.h include stdlib.h include ti ...

  2. 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II

    好久没切 leetcode 的题了,静下心来切了道,这道题比较有意思,和大家分享下. 我把它叫做 "不一样的猜数字游戏",我们先来看看传统的猜数字游戏,Guess Number H ...

  3. java 猜数字游戏

    作用:猜数字游戏.随机产生1个数字(1~10),大了.小了或者成功后给出提示. 语言:java 工具:eclipse 作者:潇洒鸿图 时间:2016.11.10 >>>>> ...

  4. 【原创Android游戏】--猜数字游戏Version 0.1

    想当年高中时经常和小伙伴在纸上或者黑板上或者学习机上玩猜数字的游戏,在当年那个手机等娱乐设备在我们那还不是很普遍的时候是很好的一个消遣的游戏,去年的时候便写了一个Android版的猜数字游戏,只是当时 ...

  5. 【原创Android游戏】--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

    --------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添 ...

  6. NOIP2003pj数字游戏[环形DP]

    题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...

  7. Codevs 1229 数字游戏

    1229 数字游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver     题目描述 Description Lele 最近上课的时候都很无聊,所以他发明了 ...

  8. codevs 1229 数字游戏(可重集的全排列)

    传送门 Description Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间.  这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后 ...

  9. XDU 1161 - 科协的数字游戏II

    Problem 1161 - 科协的数字游戏II Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty: Total Submit: 112  ...

随机推荐

  1. 关于spring中<util:/>的配置

    解决redis设置缓存时间找到的帖子,我这个初学者需要学习的还是很多的. 原文地址:http://www.doc100.net/bugs/t/216322/index.html 探索<util/ ...

  2. Java版阿里云通信短信发送API接口实例(新)

    阿里云通信(原名阿里大于)的短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力,支持快速发送短信验证码.短信通知等. 完美支撑双11期间2亿用户,发送6亿短信 ...

  3. WPF HTTP请求(GET,POST)

    WPF HTTP请求(GET,POST) using System; using System.Collections.Generic; using System.IO; using System.L ...

  4. 使用VirtualBox + Vagrant打造统一的开发环境

    https://blog.csdn.net/openn/article/details/54927375 配置步骤 安装VirtualBox 虚拟系统运行在VirtualBox中,类似的工具还有VMw ...

  5. 【JZOJ4886】【NOIP2016提高A组集训第13场11.11】字符串

    题目描述 某日mhy12345在教同学们写helloworld,要求同学们用程序输出一个给定长度的字符串,然而发现有些人输出了一些"危险"的东西,所以mhy12345想知道对于任意 ...

  6. QT_OPENGL-------- 1. WINDOW

    opengl学习第一步,首先来实现一个显示窗口. 1.首先要下载配置glfw,我在前面的文章中也提到过,具体作用可以另行百度.配置出现无法引用可参考ubuntu 使用glfw.h 出现函数无法调用. ...

  7. hdu 2412 Party at Hali-Bula【树形dp】

    HDU 2412 和poj 2342(hdu 1520)差不多,多了一个判断最优解是(Yes)否(No)唯一.关键问题也在这个判断最优解是否唯一上. 先定义dp[u][2],表示选(dp[][1])或 ...

  8. Java练习 SDUT-1132_斐波那契数列

    C/C++经典程序训练2---斐波那契数列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写计算斐波那契(Fibon ...

  9. 坚守安全第一准则!阿里云接连通过等保2.0测评、ISO国际认证

    斩获新资质 数字时代,数据的安全对于互联网用户来说显得尤为重要.阿里云更是一直坚持“安全第一准则”,致力于为客户的数据安全搭建更健全机制. 2019年5月,阿里云“电子政务云平台系统”正式通过网络安全 ...

  10. OracleSpatial函数实例

    Oracle Spatial操作geometry方法   Oracle Spatial中SDO_GEOMETRY类型: CREATE TYPE SDO_GEOMETRY AS OBJECT( SDO_ ...