题目大概说有101个质量w0、w1、w2、...、w100的砝码,和一个质量m的物品,问能否在天平两边放物品和砝码使其平衡。
哎,怎么没想到。。注意到w0、w1、w2、...、w100——
把m转化成w进制数,枚举每一位:
- 如果第i位是0那OK;
- 如果是1那就要把砝码wi放在天平另一边抵消;
- 如果是w-1那就要把砝码wi放到天平同一边,使其变为0并进位,这时第i+1位的权+1;
- 而如果是其他情况,那么肯定不能平衡了。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int wi[111]; 5 int main(){ 6 int w,m; 7 scanf("%d%d",&w,&m); 8 for(int i=0; m; ++i){ 9 wi[i]=m%w; 10 m/=w; 11 } 12 bool flag=1; 13 for(int i=0; i<=100; ++i){ 14 if(wi[i]>=w){ 15 int t=wi[i]; 16 wi[i]=w%t; 17 wi[i+1]+=w/t; 18 } 19 if(wi[i]!=0 && wi[i]!=1 && wi[i]!=w-1){ 20 flag=0; 21 break; 22 } 23 if(wi[i]==w-1){ 24 ++wi[i+1]; 25 } 26 } 27 if(flag) puts("YES"); 28 else puts("NO"); 29 return 0; 30 }