[2016-03-03][UVA][1374][Power Calculus]

Posted 红洋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2016-03-03][UVA][1374][Power Calculus]相关的知识,希望对你有一定的参考价值。

[2016-03-03][UVA][1374][Power Calculus]
  • 时间:2016-03-03 16:14:01 星期四
  • 题目编号:UVA 1374
  • 题目大意:给出x的指数n,问,x经过多少次相乘才能得到x^n
  • 输入:n
  • 输出:次数
  • 分析:
    • 求乘法的所有可能方式,用dfs,适当剪枝优化,变成IDA*
    • x的乘法,变成了指数的加法
    • 每次不断平方,最少次数 为 不断平方的次数.这个为maxd起点
  • 方法:
    • 枚举每一位出现过的次数,当前字数加上枚举出来的次数,进入下一层dfs
    • 剪枝:如果预计最少次数加上当前次数 > maxd,直接返回0
  • 解题过程遇到问题:
    • 没必要取最大值来判断剩下的,直接当前值不断平方(指数相加) 1<<(maxd - cur - 1)次即可

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
#define CLR(x,y) memset((x),(y),sizeof((x)))
#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))
#define FORD(x,y,z) for(int (x)=(y);(x)>=(z);--(x))
#define FOR2(x,y,z) for((x)=(y);(x)<(z);++(x))
#define FORD2(x,y,z) for((x)=(y);(x)>=(z);--(x))

const int maxn = 1000 + 10;
int n,arr[maxn * 2];//arr保存出现过的指数
int dfs(int cur,int curd,const int & maxd){
        if (curd == maxd)       return arr[cur - 1] == n;
        //当前值最多可以平方(1<<(maxd - curd))次,计算这么多次数之后,是否小于n
        if (arr[cur-1] * 1<<(maxd - curd) < n)        return 0;
        //枚举出现过的指数
        FORD(i,cur - 1,0){
                //产生新值,进入下一层
                arr[cur] = arr[cur-1] + arr[i];
                if (dfs(cur + 1,curd + 1, maxd))        return 1;
                arr[cur] = arr[cur-1]  - arr[i];
                if (dfs(cur + 1,curd + 1, maxd))        return 1; 
        }
        return 0;
}
int init(){
        int tmp = n,cnt = 0;
        while(tmp > 1){
                tmp /= 2;
                ++cnt;
        }
        return cnt;
}
int main(){
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        while (~scanf("%d",&n) && n){
                for(int i = init();; ++i){
                        arr[0] = 1;
                        if(dfs(1,0,i)){    
                                printf("%d\n",i);break;
                        }
                }              
        }
    return 0;
}







以上是关于[2016-03-03][UVA][1374][Power Calculus]的主要内容,如果未能解决你的问题,请参考以下文章

UVA 1374 Power Calculus

[2016-03-03][UVA][120][Stacks of Flapjacks]

UVa1374 Power Calculus(IDA*)

Power Calculus UVA - 1374 迭代加深搜索

UVa1374 Power Calculus (IDA*)

UVa 1374 - Power Calculus——[迭代加深搜索快速幂]