【HDOJ】【BestCoder Round #84】1001 Aaronson

问题描述

给出一个不定方程x 0 +2x 1 +4x 2 +...+2 m x m =n , 找出一组解(x 0 ,x 1 ,x 2 ,...,x m ) , 使得 i=0 m x i  ​​最小, 并且每个x i  (0im) 都是非负的.

输入描述

输入包含多组数据, 第一行包含一个整数T(1T10 5 ) 表示测试数据组数. 对于每组数据:
第一行包含两个整数n m(0n,m10 9 ) .

输出描述

对于每组数据, 输出 i=0 m x i  ​​的最小值.

Solution 

题目有一个补充条件,x 为整数

很容易看出来这就是个二进制拆分的问题,二进制为1 的位x 对应为1 ,如果超出了2 m  的部分就用2 m  去补,很明显会比用更小的去填要好。

#include<stdio.h>

int main()
{
    int T,n,m,ans;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d%d",&n,&m);
        for (ans=0;n && m;n>>=1,m--) ans+=(n & 1);
        ans+=n;
        printf("%d\n",ans);
    }
} 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值