Time Limit: 3 second

Memory Limit: 256 MB

【问题描述】

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

3 1 2 4

4 3 6

7 9

16

最后得到16这样一个数字。

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

【数据规模】

对于40%的数据,n≤7;

对于80%的数据,n≤10;

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

【输入格式】

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

【输出格式】

输出文件bds.out包括1行,对于每个询问输出答案。

【输入样例1】

4 16

【输出样例1】

3 1 2 4

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t030

【题解】



可以画一画样例



注意观察一下最后的答案;

发现其实最后答案=3*1+3*2+1*3+1*4

可以看到第一行的各项的系数是分别是C[3][0],C[3][1],C[3][2],C[3][3];

发现规律!

最后的答案就为

设第一行的第i列元素为a[i]

则最后一行的那一个元素为∑a[i]*C[n-1][i-1]

则我们先预处理出组合数(C[i][j] = C[i-1][j-1]+C[i-1][j])

然后枚举第一行的各个元素分别是什么;

然后O(1)得到最后一行的那唯一一个元素;

看看是不是所要求的sum;

因为这个∑符号里面的各项都是正数,所以可以写一个剪枝;

如果前i项的∑a[i]*C[n-1][i]>sum,则直接剪掉;就不用再等到i=n的时候再判断了;

sum比较小;这个剪枝还是很强力的;



【完整代码】

#include <cstdio>
#include <cstdlib>
#define rei(x) scanf("%d",&x)
#define rep1(i,x,y) for (int i = x;i <= y;i++)
const int MAXN = 15; int n,sum,a[MAXN];
int c[MAXN][MAXN];
bool bo[MAXN]; void dfs(int x,int now)
{
if (now > sum)
return;
if (x>n)
{
if (now==sum)
{
rep1(i,1,n)
{
printf("%d",a[i]);
if (i==n)
puts("");
else
putchar(' ');
}
exit(0);
}
return;
}
rep1(i,1,n)
if (!bo[i])
{
bo[i] = true;
a[x] = i;
dfs(x+1,now+c[n-1][x-1]*a[x]);
bo[i] = false;
}
} int main()
{
rep1(i,1,13)
c[i][i] = c[i][0] = 1;
rep1(i,1,13)
rep1(j,1,i-1)
c[i][j] = c[i-1][j-1]+c[i-1][j];
rei(n);rei(sum);
if (n==1)
puts("1");
else
dfs(1,0);
return 0;
}

最新文章

  1. maven执行报错resolution will not be reattempted until the update interval of nexus h
  2. Git生成ssh ksy后进行项目管理
  3. wap端开发必须基础
  4. Codeforces Round #355 (Div. 2) D. Vanya and Treasure dp+分块
  5. (转) mysql数据库引擎:MyISAM和InnoDB(性能优化)
  6. 上下切换js
  7. ionic开发ios app
  8. Maven 实现Struts2注解配置步骤详解
  9. AI 人工智能 探索 (四)
  10. phpcms v9 在当前栏目下获取父栏目与当前栏目的名称与连接
  11. 解决js中post提交数据并且跳转到指定页面的问题总结
  12. [DeeplearningAI笔记]Batch NormalizationBN算法Batch归一化_02_3.4-3.7
  13. 如何彻底的删除MySQL数据库(图文教程)
  14. oracle修改审计功能
  15. SQL Server-常用分页语句
  16. Windows 快捷方式(*.link)打开方式关联错误
  17. .NET MVC中的防CSRF攻击
  18. 版本控制git(三)-git分支
  19. 4.后台管理系统中的ajax提交或保存的两次模态框确认
  20. RocketMQ专题1:入门

热门文章

  1. 关于搭建Session服务器(转载)
  2. silverlight依据json字符串动态创建实体类
  3. 【解决方法】Unexpected namespace prefix “xmlns” found for tag Layout
  4. Flask项目之手机端租房网站的实战开发(六)
  5. 理解String的compareTo()方法返回值
  6. Android 设置背景透明度
  7. jquery设置attr属性值
  8. report_timing
  9. 每日技术总结:vue router传参方式,js获取设备高度
  10. php ignore_user_abort()实现计划(定时执行)任务功能