Problem UVA1374-Power Calculus

Accept:323  Submit:2083

Time Limit: 3000 mSec

 Problem Description

 Input

The input is a sequence of one or more lines each containing a single integer n. n is positive and less than or equal to 1000. The end of the input is indicated by a zero.

 Output

Your program should print the least total number of multiplications and divisions required to compute xn starting with x for the integer n. The numbers should be written each in a separate line without any superfluous characters such as leading or trailing spaces.

 Sample Input

1 31 70 91 473 512 811 953 0
 

 Sample Ouput

0
6
8
9
11
9
13
12

题解:IDA*算法,思路很直接,剪枝也很明显,就是如果目前最大的数,在接下来的几轮迭代中如果每次都翻倍还到不了n就剪枝。

还有一个神奇的剪枝就是每次都要利用到最后生成的那个数(不知道为啥)。

我一开始使用set进行集合操作,但是多了个log就让效率崩了,13层的就很难输出了,看了lrj的代码改成数组效率大大提高,以后在注重效率的地方还是尽量少用STL。

这个题让我比较困惑的是在代码中如果没有当 d == maxd 时return false;就会出现神奇的错误,而前几道IDA*的题目在这一点上都不太重要,冥思苦想,大概知道为啥了。

前几道类似的题目不会出现d超过maxd还能继续递归下去的情况(由估价函数可以清楚看到),但是这个题不一样,从估价函数中可以看到(见代码),这样的情况是完全可能出现的,因此可能这次递归开始设置的阈值是10,但是到10没停下来,继续深度递归,然后返回true导致程序误以为在这个阈值时正好搜索到结果,输出错误结果,这个点以后一定要注意,或者干脆每次写都加上这句,对效率应该不会有大的影响,理解不对的地方请大佬指教。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <set> using namespace std; const int maxn = ; int n,maxd;
int a[maxn+]; bool dfs(int d) {
if (a[d] == n) return true;
if (d == maxd) return false; int Max = a[];
for (int i = ; i <= d; i++) {
Max = Max > a[i] ? Max : a[i];
}
if ((Max << (maxd - d)) < n) return false; for (int i = d; i >= ; i--) {
a[d + ] = a[d] + a[i];
if (dfs(d + )) return true;
a[d + ] = a[d] - a[i];
if (dfs(d + )) return true;
}
return false;
} int main()
{
//freopen("input.txt", "r", stdin);
while (scanf("%d", &n) == && n) {
if (n == ) {
printf("0\n");
continue;
}
memset(a, , sizeof(a));
a[] = ;
for (maxd = ;; maxd++) {
if(dfs()) break;
}
printf("%d\n", maxd);
}
return ;
}

UVA1374-Power Calculus(迭代加深搜索)的更多相关文章

  1. UVA1374-Power Calculus(迭代加深搜索)

    Problem UVA1374-Power Calculus Accept:107  Submit:584 Time Limit: 3000 mSec  Problem Description  In ...

  2. POJ 3134 Power Calculus (迭代剪枝搜索)

    题目大意:略 题目里所有的运算都是幂运算,所以转化成指数的加减 由于搜索层数不会超过$2*log$层,所以用一个栈存储哪些数已经被组合出来了,不必暴力枚举哪些数已经被搜出来了 然后跑$iddfs$就行 ...

  3. UVA-1374 Power Calculus (迭代加深搜索)

    题目大意:问最少经过几次乘除法可以使x变成xn. 题目分析:迭代加深搜索. 代码如下: # include<iostream> # include<cstdio> # incl ...

  4. 【算法•日更•第三十九期】迭代加深搜索:洛谷SP7579 YOKOF - Power Calculus 题解

    废话不多说,直接上题: SP7579 YOKOF - Power Calculus 题意翻译 (略过没有营养的题干) 题目大意: 给出正整数n,若只能使用乘法或除法,输出使x经过运算(自己乘或除自己, ...

  5. Power Calculus UVA - 1374 迭代加深搜索

    迭代加深搜索经典题目,好久不做迭代加深搜索题目,拿来复习了,我们直接对当前深度进行搜索,注意剪枝,还有数组要适当开大,因为2^maxd可能很大 题目:题目链接 AC代码: #include <i ...

  6. POJ1129Channel Allocation[迭代加深搜索 四色定理]

    Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14601   Accepted: 74 ...

  7. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  8. 迭代加深搜索 POJ 1129 Channel Allocation

    POJ 1129 Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14191   Acc ...

  9. 迭代加深搜索 codevs 2541 幂运算

    codevs 2541 幂运算  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出 ...

  10. HDU 1560 DNA sequence (IDA* 迭代加深 搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...

随机推荐

  1. Java学习笔记之——单例模式

      (1)懒汉式:对象在方法中,第一次调用时创建对象,线程不安全的 public class Singleton { //外部不可以创建对象,就要在内部创建一个对象,还能够在外部获取 private ...

  2. css 如何让背景图片拉伸填充避免重复显示

    如何让背景图片拉伸填充,这个问题听起来似乎很简单.但是很遗憾的告诉大家.不是我们想的那么简单. 比如一个容器(body,div,span)中设定一个背景.这个背景的长宽值在css2.1之前是不能被修改 ...

  3. #WEB安全基础 : HTML/CSS | 0x2初识a标签

    教你点厉害玩意,尝尝HTML的厉害! 我为了这节课写了一些东西,你来看看

  4. #WEB安全基础 : HTML/CSS | 0x1初识CSS

    "我受够这些难看的网页了,我怎么才能让它变得好看点?"你说. 我答道:"看来你得学点CSS了" 学习这些东西只有一个原则,就是用你的脑袋想,用你的眼睛看,用的你 ...

  5. vue-awesome-swiper 水平滚动异常

    使用教程:https://github.com/cynthiawupore/vue-awesome-swiper 实例: <template> <div class="in ...

  6. 2018-09-06 Java实现英汉词典API初版发布在Maven

    在打算批量代码汉化工具 · Issue #86 · program-in-chinese/overview时, 发现没有现成的Java库实现英汉查询功能. 于是开此项目. 源码库: program-i ...

  7. Django引入静态文件

    在HTML文件中引入方式: 简单引入一个bootstrap中的内敛表单,效果图如下:

  8. 如何用ABP框架快速完成项目(2) - 快的定义!

    为什么要从快的角度来讲这系列课程呢?   因为快是一个很统一很清晰的标准. 所有人对时间都有一个统一清晰的概念.  比如说这系列课程会讲到的一个实例: 集成LinqToExcel, 用我的方法大概耗时 ...

  9. redis 数据库安装和基本使用

    Redis 介绍: Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值可以包 ...

  10. 你不可不知的Java引用类型之——虚引用

    定义 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个.一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获 ...