1449 砝碼稱重 1 秒 (貪心)
阿新 • • 發佈:2018-11-30
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"); } }