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