51 nod 砝码称重(贪心+进制转换思想)

来源:互联网 发布:爱玩网络充值 编辑:程序博客网 时间:2024/06/05 07:31



现在有好多种砝码,他们的重量是 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




挺难想的   m能否用天平称出来的关键是如何使天平平衡    

如果物体m可以被称出来   可表示为    m + 一堆砝码(可能为0)=  另一堆砝码      

由于砝码的重量是幂的形式并且个数只有一个      

所以我们取出的一堆砝码的重量就可以表示为w进制下  一个由 0 1 组成的串    

基于此  我们可以将m也转化成w进制   

现在  判断物体m是否可以被称出来   就变成了   m +  一个w进制下由 0 1 组成的串 是否可以组成一个新的由 0 1  组成的串(另一堆砝码)

当由m转化成的w进制的某一位为0或者1时 给他它+0(理解为不作处理)  如果为w-1时  我们就给它+1(相当于加一个砝码) 使其进位  本位变为0   如果是其他情况  就不能转化成 0 1 组成的串   所以就不能称出





AC代码:

#include <stdio.h>int main (){    int w,m;    scanf ("%d%d",&w,&m);    while (m){        if (m%w==0||m%w==1){            m=m/w;        }        else if (m%w==w-1){            m=(m+1)/w;        }        else {            printf ("NO\n");            return 0;        }    }    printf ("YES\n");    return 0;}



原创粉丝点击