1374 - Power Calculus

Starting with x andrepeatedly multiplying by x, we can compute x31 withthirty multiplications:

x2 = x x x,     x3 = x2 x x,     x4 = x3 x x,     ... ,     x31 = x30 x x.

The operation of squaring can appreciablyshorten the sequence of multiplications. The following is a way tocompute x31 with eight multiplications:

x2 = x x x,     x3 = x2 x x,     x6 = x3 x x3,     x7 = x6 x x,     x14 = x7 x x7
x15 = x14 x x,     x30 = x15 x x15,     x31 = x30 x x.

This is not the shortest sequence of multiplicationsto compute x31. There are many ways with only sevenmultiplications. The following is one of them:

x2 = x x x,     x4 = x2 x x2,     x8 = x4 x x4,     x10 = x8 x x2
x20 = x10 x x10,     x30 = x20 x x10,     x31 = x30 x x.

There however is no way to compute x31 withfewer multiplications. Thus this is one of the most efficient ways tocompute x31 only by multiplications.

If division is also available, we can finda shorter sequence of operations. It is possible to compute x31 withsix operations (five multiplications and one division):

x2 = x x x,     x4 = x2 x x2,     x8 = x4 x x4,     x16 = x8 x x8,     x32 = x16 xx16,     x31 = x32 ÷ x.

This is one of the most efficient ways tocompute x31 if a division is as fast as amultiplication.

Your mission is to write a program to findthe least number of operations to compute xn bymultiplication and division starting with x for the givenpositive integer n. Products and quotients appearing in thesequence of operations should be x to a positive integer'spower. In other words, x-3, for example, should neverappear.

Input 

The input is a sequence of one or morelines each containing a single integer nn ispositive and less than or equal to 1000. The end of the input is indicated by azero.

Output 

Your program should print the least totalnumber of multiplications and divisions required to compute xn startingwith x for the integer n. The numbers should bewritten each in a separate line without any superfluous characters such asleading or trailing spaces.

SampleInput 

1

31

70

91

473

512

811

953

0

SampleOutput 

0

6

8

9

11

9

13

12

代码:

// UVa1374 Power Calculus

// Rujia Liu

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

const int maxans = 13; // we got it by experimenting

int n, a[maxans+1];

bool dfs(int d, int maxd) {

if(a[d] == n) return true;

if(d == maxd) return false;

int maxv = a[0];

for(int i = 1; i <= d; i++) maxv = max(maxv, a[i]);

if((maxv << (maxd-d)) < n) return false;

// Always use the last value.

// I can't prove it, but we haven't found a counter-example for n <= 1000

for(int i = d; i >= 0; i--) {

a[d+1] = a[d] + a[i];

if(dfs(d+1, maxd)) return true;

a[d+1] = a[d] - a[i];

if(dfs(d+1, maxd)) return true;

}

return false;

}

int solve(int n) {

if(n == 1) return 0;

a[0] = 1;

for(int maxd = 1; maxd < maxans; maxd++) {

if(dfs(0, maxd)) return maxd;

}

return maxans;

}

int main() {

while(scanf("%d", &n) == 1 && n) {

printf("%d\n", solve(n));

}

return 0;

}

 

�#< �/QpSNormal>{

   int T;

   scanf("%d", &T);

   while(T--)

    {

       scanf("%lf%d", &r, &n);

       for(int i = 0; i < n; i++) scanf("%lf", &w[i]);

       for(int i = 0; i < (1<<n); i++)

       {

           sum[i] = 0;

           tree[i].clear();

           for(int j = 0; j < n; j++)

                if(i & (1<<j)) sum[i]+= w[j];

       }

       int root = (1<<n)-1;

       memset(vis, 0, sizeof(vis));

       dfs(root);

       double ans = -1;

       for(int i = 0; i < tree[root].size(); i++)

           ans = max(ans, tree[root][i].L + tree[root][i].R);

       printf("%.10lf\n", ans);

    }

   return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值