51nod 1449 砝码称重,贪心


题目来源:  CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40  难度:4级算法题

现在有好多种砝码,他们的重量是  w0,w1,w2,... w0,w1,w2,...  每种各一个。问用这些砝码能不能表示一个重量为m的东西。

样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中。


Input
单组测试数据。 
第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9)。
Output
如果能,输出YES,否则输出NO。
Sample Input
3 7
Sample Output
YES


分析:

根据题意,不妨我们假设w=10,那么砝码有:

         1;10;100;1000;10000;...........

有这样的规律:

上面那些砝码,只能组成 10010这样只有1和0的数字。

如:10010=10000+10;


不妨假设天平左边放砝码,所以左边只能是 只含0和1的数字

所以需要把右边也凑出这种形式


那么m在什么情况下可以称出来呢?

如果m也是只含有1和0的数字,那不用判断了,肯定能称出来;


否则,可以利用砝码增加m的重量。使得m加上一些砝码==另一些砝码

比如m=9,可以加一个1的砝码,m=m+1=10, 10就可以称出来了。

如果m=8,只有一个1的砝码,凑不到10,所以m=8凑不出来。

同理m=7,6,5,....3,2,都凑不出来。


也就是说,m能成功的情况只有两种

1、m只含有0和1

2、m加上某些砝码后,变成情况1。


对于情况2,我们应该从m的最低位开始考虑,不妨设m=889,

最低位是9,加上1,就可以使最低位变成0。这步之后m = 889+1 =890

然后第二位是9,同上一步,加上1,      这步之后m = 890+10 = 900

然后第三位是9,同上一步,加上1,       m = 900+100 = 1000

ok,这个m在加上1,10,100三个砝码之后,重量是1000,是可以称出来的


举个反例,如m=79

最低位是9,加上1,可以使这一位变成0,。这步之后 m = 79+1 = 80

第二位是8,没有砝码能把8凑到1或0。

所以m=79是称不出来的。


综上,我们就按w=10来考虑这个问题,完全可以。

把w推广到任意数,其实就可以看做把10进制数 转化 成其他进制 

计算方式与w=10十进制时相同


#include<stdio.h>  
#include<math.h>  
int main()  
{  
    int w,m;  
    scanf("%d%d",&w,&m);
    while(m)  
    {  
        int t=m%w;
        if(t==1||t==0);  //砝码边可以放一个砝码,无需操作 
        else if(w%(t+1)==0)  //t加上1就可以进位了
            m++;     //物边可以加一个w的r次方平衡一下 ,但低位都没了,m加1即可
        else    //失败  
        {  
            puts("NO");
            return 0;
        } 
        m=m/w;  
    }
    puts("YES");  
    return 0;  
} 


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪的期许

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值