码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-03-03 19:33:56      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

[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]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/5239685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!