51nod 1449 砝码称重【天平/进制】

题意:
给你w,n,问你在w^0,w^1,w^2...各种一个,问你能不能用这些砝码和重量为m的东西放在天平上使得天平平衡;
思路:
这个很容易联想到进制:
如果把m放在是一边的话,其实对于砝码就是纯粹的相加,能不能被表示成这样一个进制,每个位上就是是0或1
那么如果两边都要放呢?
所以就是说我要怎么利用m和已拥有的,构造一个仅有01的进制数
为什么这么说呢?因为是左边右边等价啊;

然后从低位往高位处理,保证砝码利用次数<=1;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const double eps=1e-5;
const double pi=acos(-1.0);
//const int mod=1e9+7;
const int INF=0x3f3f3f3f;

int w,n;
int bit[35];
int num;

void init()
{
    num=0;
    while(n)
    {
        bit[num++]=n%w;
        n/=w;
    }
}

int main()
{
    scanf("%d%d",&w,&n);
    init();

    for(int i=0;i<num;i++)
    {
        if(bit[i]>=w)
        {
            bit[i]-=w;
            bit[i+1]++;
        }
        if(bit[i]<=1)   //0就用,1就不用
            continue;
        else if(bit[i]==w-1)    //和m一边的+w^(i-1)使得另一边只要+w^i的就行;
            bit[i+1]++;
        else
        {
            puts("NO");
            return 0;
        }
    }
    puts("YES");
    return 0;
}







posted @ 2016-11-28 16:44  see_you_later  阅读(180)  评论(0编辑  收藏  举报