1. 程式人生 > >51 nod 砝碼稱重(貪心+進位制轉換思想)

51 nod 砝碼稱重(貪心+進位制轉換思想)

現在有好多種砝碼,他們的重量是 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;
}