HDU OJ 5747(Aaronson)

Aaronson

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 616 Accepted Submission(s): 354

Problem Description
Recently, Peter saw the equation x0+2x1+4x2+…+2mxm=n. He wants to find a solution (x0,x1,x2,…,xm) in such a manner that ∑i=0mxi is minimum and every xi (0≤i≤m) is non-negative.

Input
There are multiple test cases. The first line of input contains an integer T (1≤T≤105), indicating the number of test cases. For each test case:

The first contains two integers n and m (0≤n,m≤109).

Output
For each test case, output the minimum value of ∑i=0mxi.

Sample Input
10
1 2
3 2
5 2
10 2
10 3
10 4
13 5
20 4
11 11
12 3

Sample Output
1
2
2
3
2
2
3
2
3
2

Source
BestCoder Round #84
题目应该看得懂首先这里的xi都是非负整数。以10 2为例结果是3,所以就有2^0(1)x0+2^1(2)x1+2^2(4)x2=10,要想让x0+x1+x2就要从右往左便利,依次挑选合适的条件,这里就是挑选了2个4,1个2,0个1,具体代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m,ans=0,i,a[1001],t1;
        scanf("%d%d",&n,&m);
        t1=m;//t1赋值为m,如果没有a[i]>=n就直接从m开始遍历
        for(i=0; i<=m; i++)
        {
            a[i]=pow(2,i);
            if(a[i]>=n)
            {
                t1=i;
                break;
            }
        }
        for(i=t1; i>=0; i--)
        {
            if(n>=a[i])
            {
                ans+=n/a[i];//挑选几个最大的
                n=n%a[i];//挑选后剩余的
            }
        }
        printf("%d\n",ans);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值