51NOD 1449 砝码称重(贪心+进制思想)


题目连接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1449

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

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

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


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


简单的中文, 不简单的思想;


刚开始 我认为可以 母函数的思想, 把能凑出来的数都枚举出来,然后看看m 在不在里面,但是,  数据量过大,不好控制,  

后来,和我说 用进制的思想,  类似于2进制 10 进制 只有0 1这样 来考虑  

也就是说  我们把 m, 转换成 w进制的 一个数, 当 余数是 0 1 的时候 即, m 一定 能用w 来表示,  当m 与 w 之间 缺个1 就好比 9 与10 缺一  89 与100 后面的9 与10 缺1  

这样是 我们可以通过加1 个或2 个 来做成平衡,  但是 当为其他情况时  差距超过2 时  无法用w 来表示;就是no


#include <iostream>
#include <queue>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>

using namespace std;

int main()
{
    int w,m;
    while(~scanf("%d %d",&w,&m))
    {
        int flag=0;
        while(m)
        {
            if(m%w==0||m%w==1)// 能用w 来表示
            {
                m/=w;
            }
            else if((m+1)%w==0)//如果补1 后可以余除
            {
                m=(m+1)/w; //补1
            }
            else
            {
                printf("NO\n");
                    flag=1;
                    break;

            }
        }
        if(!flag)
            printf("YES\n");
    }
    return 0;
}



posted @ 2017-05-18 13:47  Sizaif  阅读(170)  评论(0编辑  收藏  举报