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

【t030】数字构造的更多相关文章

  1. 【t005】数字构造问题

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 给定一个只包含数字[0..9]的字符串,请使用字符串中的某些字符,构建一个能够整除15最大的整数.注意, ...

  2. 浅谈无字母数字构造webshell

    0x00 问题 <?php include 'flag.php'; if(isset($_GET['code'])){ $code = $_GET['code']; if(strlen($cod ...

  3. TTTTTTTTTTTTTT CF 95 B 构造4,7幸运数字 贪心 构造 string

    B. Lucky Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. 涨姿势:抛弃字母、数字和下划线写SHELL

    PHP中异或 (^) 的概念 <?php echo"A"^"?";?> <?php echo"A"^"?&quo ...

  5. java面试题总汇

    coreJava部分 7 1.面向对象的特征有哪些方面? 7 2.作用域public,private,protected,以及不写时的区别? 7 3.String 是最基本的数据类型吗? 7 4.fl ...

  6. BZOJ 4724: [POI2017]Podzielno

    Description 由\([0,B-1]\)的数字构造一个 \(B\) 进制数字,使得他是 \(B-1\) 的倍数. Sol 贪心+二分. 首先 \(X\) 是 \(B-1\) 的倍数,那么有 \ ...

  7. boost学习笔记(七)---date_time库

    date_time库的日期基于格里高利历,支持从1400-01-01到9999-12-31之间的日期计算 #define BOOST_DATE_TIME_SOURCE #include <boo ...

  8. Winform开发框架之统计图表的实现

    在前面的一些随笔中,介绍了不少我的Winform框架的特性,上篇随笔<Winform开发框架之通用高级查询模块>对其中的通用高级模块进了一个整理说明,本篇继续介绍Winform开发框架重要 ...

  9. [转载]Winform开发框架之统计图表的实现

    在前面的一些随笔中,介绍了不少我的Winform框架的特性,上篇随笔<Winform开发框架之通用高级查询模块>对其中的通用高级模块进了一个整理说明,本篇继续介绍Winform开发框架重要 ...

随机推荐

  1. Android 开发之锁屏弹窗

    尝试利用 WindowManager 添加浮窗的方式实现 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级来让窗 ...

  2. 当鼠标聚焦时输入框变色(focus事件实例)

    当鼠标聚焦时输入框变色css相关,鼠标点击<input>输入域后出现有颜色的边框原理:css伪类之input输入框鼠标点击边框变色效果伪类元素的使用::focus 一:当输入框获得焦点时, ...

  3. 十分钟上手-搭建vue开发环境(新手教程)

    想写一些关于vue的文章已经很久了,因为这个框架已经火了很久,在公司里用的框架都比较老旧,但怎么也得跟上前端发展变化的潮流,这不,开始使用vue开发项目了,一遍开发一边踩坑中,今天要记录的是五分钟搭建 ...

  4. 【干货】前端开发者最常用的六款IDE

    一.Visual Studio Code 下载地址:https://code.visualstudio.com/ 功能介绍: 微软在2015年4月30日Build 开发者大会上正式宣布了 Visual ...

  5. 11. Spring Boot JPA 连接数据库

    转自:https://blog.csdn.net/catoop/article/details/50508397

  6. 关于python的二维数组

    test =[ [1, 2, 3], [4, 5, 6], [7, 8, 9]]   #这个就可以看做是二维数组了,直接创建print(test)print(test[:][1])           ...

  7. 软件——机器学习与Python,if __name__ == '__main__':函数

    if __name__ == '__main__': 想必很多初次接触python都会见到这样一个语句,if __name__ == "__main__": 那么这个语句到底是做什 ...

  8. 就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这

    原标题:就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这 又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百 ...

  9. STL algorithm算法mov,move_backward(38)

    move原型: std::move template <class InputIterator, class OutputIterator> OutputIterator move (In ...

  10. 云服务器搭建 Nginx 静态网站

    第一步:安装 Nginx 在 CentOS 上,可直接使用 yum 来安装 Nginx(当然也可以通过下载压缩包.解压.编译的方式安装,不过太麻烦了) yum install nginx -y 第二步 ...