我刚开始的思路就是:用启发函数max * pow(2 , maxd - d) < n直接去判断,两个for循环往数组延伸,找到n为止,可是速度太慢。刘汝佳大哥说的直接使用新延伸出来的数,这样确实加快了,0秒过,可是他没有解释。

效率低的代码:

#include<cstring>
#include<cstdio>
#include<cmath>
const int maxn=4000+5;
int vis[maxn*2],res[maxn];
int n;
bool dfs(int d,int maxd,int cnt){
    long long maxt=-1;
    for(int i=1;i<=cnt;++i)
        if(maxt<res[cnt]) maxt=res[cnt];
    if(d>maxd||maxt*pow(2,maxd-d)<n) return false; //启发函数
    if(res[cnt]==n) return true;
    for(int i=1;i<=cnt;++i)
        for(int j=1;j<=cnt;++j){
            int t1=res[i]+res[j]; //加法
            if(!vis[t1]) {
                vis[t1]=1;
                res[cnt+1]=t1;
                if(dfs(d+1,maxd,cnt+1)) return true;
                vis[t1]=0;
            }

            int t2=res[i]-res[j]; //减法
            if(t2>0&&!vis[t2]) {
                vis[t2]=1;
                res[cnt+1]=t2;
                if(dfs(d+1,maxd,cnt+1)) return true;
                vis[t2]=0;
            }
    }
    return false;
}
int main(){
    res[1]=1;
    while(scanf("%d",&n)==1&&n){
        memset(vis,0,sizeof(vis));
        vis[1]=1;
        for(int maxd=0;;++maxd){
            if(dfs(0,maxd,1)) {
                printf("%d\n",maxd);
                break;
            }
        }
    }
    return 0;
}
贴出这个代码,是提供一个正常思路。

AC代码

#include<cstring>
#include<cstdio>
#include<cmath>
const int maxn=100+5;
int vis[maxn*1000],res[maxn];
int n;
bool dfs(int d,int maxd,int cnt){
    int maxt=-1;
    for(int i=1;i<=cnt;++i)
        if(maxt<res[cnt]) maxt=res[cnt];
    if(d>maxd||maxt*pow(2,maxd-d)<n) return false; //启发函数
    if(res[cnt]==n) return true;
    for(int i=cnt;i>0;--i){
        int t1=res[cnt]+res[i];//加法
        if(!vis[t1]){
            vis[t1]=1;
            res[cnt+1]=t1;
            if(dfs(d+1,maxd,cnt+1)) return true;
            vis[t1]=0;
        }
        int t2=res[cnt]-res[i];
        if(t2>0&&!vis[t2]){
            vis[t2]=1;
            res[cnt+1]=t2;
            if(dfs(d+1,maxd,cnt+1)) return true;
            vis[t2]=0;
        }
    }
    return false;
}
int main(){
    res[1]=1;
    while(scanf("%d",&n)==1&&n){
        memset(vis,0,sizeof(vis));
        vis[1]=1;
        for(int maxd=0;;++maxd){
            if(dfs(0,maxd,1)) {
                printf("%d\n",maxd);
                break;
            }
        }
    }
    return 0;
}

如有不当之处欢迎指出!

UVA1374 IDA*的更多相关文章

  1. UVa 1374 快速幂计算(dfs+IDA*)

    https://vjudge.net/problem/UVA-1374 题意:给出n,计算最少需要几次能让x成为x^n(x和已经生成的数相乘或相除). 思路:IDA*算法. 如果当前数组中最大的数乘以 ...

  2. 逆向工程 - Reveal、IDA、Hopper、HTTPS抓包 等

    目录: 一. iOS 如何做才安全 二.ipa文件 三.沙盒 中的数据 四.Reveal:查看 任何APP 的UI结构 五.反编译工具:IDA 六.反编译工具:Hopper Disassembler ...

  3. IDA的脚本IDC的一个简单使用

    目的:主要是想学习一下IDA的IDC的脚本的使用.这里做了一个小的测试. 这里使用的是VS2015Community来生成文件的. 一.编写测试程序: 这里先生成我们的目标数据. 然后编写测试程序.得 ...

  4. 安卓动态调试七种武器之孔雀翎 – Ida Pro

    安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...

  5. iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA

    原文在此 一.Reveal 1 一般使用     Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局.如下图所示:     Reveal是需要付费的,需要89美元, ...

  6. IDA插件栈字符串识别插件

    该插件是一款可以自动识别栈上局部变量为字符串的插件,字符串形式如下,并自动的加上注释                                       如图:可以自动识别栈上的字符串 项目主 ...

  7. Android动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

  8. 计算机病毒实践汇总六:IDA Pro基础

    在尝试学习分析的过程中,判断结论不一定准确,只是一些我自己的思考和探索.敬请批评指正! 1. IDA使用 (1)搜索.下载并执行IDA Pro,对可执行程序lab05-01.dll进行装载,分别以图形 ...

  9. IDA在内存中dump出android的Dex文件

    转载自http://drops.wooyun.org/tips/6840 在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非 ...

随机推荐

  1. Navicat查询结果不能修改的原因

    问题: 开发中常使用Navicat查询数据库,并修改数据库中的值.今天发现查询结果为只读,不能修改.一般连表查不能修改我是知道的,但是单表查居然不能修改. 解决方法: 查了下,有说表是只读,也有说是权 ...

  2. Halcon一日一练:创建三通道图像

    首先理解一个什么是三通道图像: 三通道图像就是彩色图像,我们之前黑白相机或黑白电视机都是彩用的灰阶图像,即单通道图像,一般是2的8次方个灰阶,即256个灰阶.彩色图像采用RGB,红绿蓝三个通道来合成彩 ...

  3. win10汇编如何debug(小白向)

    先引用别人的方法 http://blog.csdn.net/lcr_happy/article/details/52491107 按他所说的下完对应软件后,安装其中的dosbox,然后将debug.e ...

  4. gd库的安装

    gd库简介 主要用途编辑 在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或者对网站数据生成报表等.在PHP处理图像,可使用GD库,而GD库开始时是支持GIF的,但由于 ...

  5. 端口扫描命令nmap

    转:http://www.osyunwei.com/archives/2004.html 下面教大家在CentOS中用nmap查看主机端口: 一.安装nmap yum install nmap -y ...

  6. 封装的应用【example_Array工具】

    定义一个数组工具[ArrayTool]封装其方法,ArrayDemo调用数组工具ArrayTool package new_Object; //封装多个个功能 class ArrayTool{ //1 ...

  7. 关于if和else嵌套—蛋疼

    嵌套使用的时候else if和else遵循就近原则,和上面最靠近该语句的if语句匹配,要把else if看成是一个整体.就这么干,这样好理解一点. 一个if...else if...else语句中可以 ...

  8. 安装 cgilib 0.5

    下载软件包下载链接:http://pan.baidu.com/s/1gdzOiVT 解包tar zxvf cgilib-0.5.tar.gzcd cgilib-0.5 makecp libcgi.a ...

  9. vue项目实战总结

    马上过年了,最近工作不太忙,再加上本人最近比较懒,毫无斗志,不愿学习新东西,或许是要过年的缘故(感觉像是在找接口). 就把前一段时间做过的vue项目,进行一次完整的总结. 这次算是详细总结,会从项目的 ...

  10. Java高并发的常见应对方案

    Java高并发的常见应对方案 一.关于并发我们说的高并发是什么? 在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来. 高并发,通常关心的系统指标与业务指标? QPS:每秒钟查询量,广 ...