1. 程式人生 > >1449 砝碼稱重 1 秒 (貪心)

1449 砝碼稱重 1 秒 (貪心)

1449 砝碼稱重
1 秒 131,072 KB 40 分 4 級題
現在有好多種砝碼,他們的重量是 w0,w1,w2,... 每種各一個。問用這些砝碼能不能表示一個重量為m的東西。

樣例解釋:可以將重物和3放到一個托盤中,9和1放到另外一個托盤中。

思路:

w進位制演算法,
如果沒有天平,只是這些砝碼錶示m的話,只需要將m表示成w進位制數,然後要求每一位不是0就是1.(每個質量的砝碼只有一個,要麼放,要麼不放)
現在有這個天平,n這個數就是 兩個 0 1 組成的數之差
因為有借位問題,相差為1是可以的
即只有下面四種情況:

0-0=0 1-0=1 0-1=w-1(向高位借一後) 1-1=0

分為三大類:

第一大類:相應位數之差為0 1的就很明瞭

第二大類:相應位數之差為w-1的,借位後的那一位在後面給它加上 1 就好了

第三大類:其餘情況就是無解了

程式碼:

package _51_node.greedy;

import java.util.Scanner;

public class ex_1449 {

    /**
     * 1449 砝碼稱重
     * 1 秒  131,072 KB 40 分 4 級題
     * <p>
     * w進位制演算法,
     * 如果沒有天平,只是這些砝碼錶示m的話,只需要將m表示成w進位制數,然後要求每一位不是0就是1.(每個質量的砝碼只有一個,要麼放,要麼不放)
     * <p>
     * 現在有這個天平,n這個數就是 兩個 0 1 組成的數之差
     * 因為有借位問題,相差為1是可以的
     * 即只有下面四種情況:
     *
     * 0-0=0   1-0=1    0-1=w-1(向高位借一後)  1-1=0
     *
     * 分為三大類:
     *
     * 第一大類:相應位數之差為0  1的就很明瞭
     *
     * 第二大類:相應位數之差為w-1的,借位後的那一位在後面給它加上 1  就好了
     *
     * 第三大類:其餘情況就是無解了
     *
     * @param args
     */
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int w = cin.nextInt();
        int n = cin.nextInt();
        boolean flag = true;
        while (n != 0) {
            if (n % w == 0 || n % w == 1) n /= w;
            else if ((n + 1) % w == 0) n = (n + 1) / w;
            else {
                flag = false;
                break;
            }
        }
        if (flag) System.out.println("YES");
        else System.out.println("NO");
    }
}