Addition Chains

题面

对于一个数列 \(a_1,a_2 \dots a_{m-1},a_m\) 且 \(a_1<a_2 \dots a_{m-1}<a_m\)。

数列中的一个数 \(a_k(2<k<=m)\) ,都有两个数 \(a_i,a_j(1<=i,j<k)\) 满足 \(a_i+a_j=a_k\)( \(i\) 可以等于\(j\) )。

换句话说就是 \(a_k\) 前面有两个数可以加起来等于 \(a_k\)​ 。这种数列就是加法链。

题目输入一个 \(n\) ,让你输出长度最小且以 \(n\) 结尾的加法链。

思路

  • 本题在 \(oj\) 过了,落谷貌似卡死了

  • 迭代加深优化搜索顺序

  • 不难看出题目中有最小的的字眼,并且可以确定这玩意儿可以用搜索

  • 那么迭代加深就是最好的选择,这里简单说一下迭代加深

    • 迭代加深,顾名思义,我们都知道在深搜时利用的是栈,那么官方点说就是形成了搜索树,如果你想要的答案有多解,按照树的思想就是你的多个答案分布在不同层中,要想最快得到答案,必然是去那个最近的层数。
    • 因此我们可以限制搜索层数,让其挨个搜索,减少没有用的冗杂操作。这种方法叫最优性剪枝,又称迭代加深,善于在搜索中找到最“小”答案。
  • 本题还有一个剪枝的地方,那就是优化搜索顺序,不同搜索顺序形成的搜索树大小差距倍大,

  • 题中要求最大数是 \(n\),如果抛开问题,我要求你找出可以组成 \(n\) 的数,是不是越大越好,所以要想尽快找到陪成 \(n\) 的数,那就需要从大数往前扫,

  • 依据这个特性,是不是我们需要求的 \(a_i\) 都符合以上条件,这就是需要更改搜索顺序的原因

Code

#include <iostream>//迭代加深
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll; const int manx=1e6+10;
const int mamx = 1e6 + 11;
const ll mod = 2123400401301379571;
const int inf = 0x3f3f3f3f; inline int read() {
char c = getchar(); int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
int n,a[manx],minx,ans[manx];
void dfs(int dep){//迭代加深
if(dep-1 > minx) return;//日常边界
if(a[dep-1] > n) return;//日常边界
if(a[dep-1] == n){
if((dep-1) > minx)
return;
minx = dep - 1;//更新
for(int i = 1;i <= n; i++) ans[i] = a[i];
//else return;
}
else{
for(int i = dep - 1;i >= 1; i--){//优化搜索顺序
if(a[dep-1] + a[i] <= n){
a[dep] = a[dep-1] + a[i];
dfs(dep + 1);
a[dep] = 0;
}
}
}
}
int main(){
while(1){
n = read();
if(n == 0) return 0;
minx = 99999999;//我感觉这玩意挺神的,这个minx一是动态的,一直在更新,是的我们的答案更小
a[1] = 1;
dfs(2);
for(int i = 1;i <= minx; i++) cout<<ans[i]<<" ";
cout<<endl;
}
return 0;
}

「一本通 1.3 例 4」Addition Chains的更多相关文章

  1. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  2. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  3. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  4. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  5. 「一本通 1.3 例 5」weight]

    「一本通 1.3 例 5」weight 题面 给定原数列 \(a_1,a_2,a_n\) ,给定每个数的前缀和以及后缀和,并且打乱顺序. 给出一个集合 \(S\) 要求从集合 \(S\) 中找到合适的 ...

  6. 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie

    题目描述 在给定的 $N$ 个整数 $A_1,A_2,A_3...A_n$ 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数$N$. 第二行$N$个整数$A_i$. 输出格式 ...

  7. 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd

    题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...

  8. 「LOJ#10034」「一本通 2.1 例 2」图书管理 (map

    题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需 ...

  9. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

随机推荐

  1. JDBC(五)—— 批量插入数据

    批量插入数据 @Test public void testInsert() throws Exception { Connection conn = null; PreparedStatement p ...

  2. Ubuntu和UOS+mips64l龙芯处理器安装编译Openssl

    1.下载openssl开发包文件,我这里下载的是openssl-1.1.1f.tar.gz:并放在/data/home/dengchaoqun/openssl1.1.1目录下 2.终端切换到当前目录下 ...

  3. DRF之访问权限控制和访问频率控制(节流)

    权限控制 前言 用户验证用户权限,根据不同访问权限控制对不同内容的访问. 建议了解视图.token验证的内容. 使用流程 自定义访问权限类,继承BasePermission,重写has_permiss ...

  4. 「珍贵历史资料鉴赏」CF786B 题解

    写在前面 偶然翻到一篇 2019-08-07 18:58 写的未发布的题解. 给大家找点乐子玩. 正文 知识点:线段树优化建图 线段树优化建图 用于解决 类似 从 x 向区间[L,R]的 区间连边问题 ...

  5. 快速了解JavaScript的基础知识

    注释 单行注释: // 单行注释 多行注释: /* 多行 注释 */ 历史上 JavaScript 可以兼容 HTML 注释,因此 <!-- 和 --> 也可以是单行注释. x = 1; ...

  6. win安装python模块出现依赖问题的解决方法 & No module named 'MySqldb'

    前言 一年多了,还在写这种问题,羞愧. 新公司不让用自己的电脑,配的winPC,项目启不起来,之前也出现过这个问题,是py3缺少某个模块,但是自己没记,这次记一下好了. No module named ...

  7. PAT甲级练习 1087 All Roads Lead to Rome (30分) 字符串hash + dijkstra

    题目分析: 这题我在写的时候在PTA提交能过但是在牛客网就WA了一个点,先写一下思路留个坑 这题的简单来说就是需要找一条最短路->最开心->点最少(平均幸福指数自然就高了),由于本题给出的 ...

  8. 终于可以愉快的撸Java异步代码了!

      异步响应式编程可以极大的提高系统的并发呑吐量,但由于Java没有类似于其他语言的Async/Await机制,所以只能通过CompletableFuture.thenXXX()来串联各个异步任务,这 ...

  9. Python绘制雷达图(俗称六芒星)

    原文链接:https://blog.csdn.net/Just_youHG/article/details/83904618 背景 <Python数据分析与挖掘实战> 案例2–航空公司客户 ...

  10. 【Web】实现动态文章列表

    简单记录 -慕课网- 步骤二:动态文章列表效果 实现这个 一个网页中常见的文章列表效果. 怎么实现文章列表案例 分解一波,CSS来改变样式 标题标签 HTML的无序列表 去掉项目符号 符号所占空间 列 ...