[BaekJoon]1052水瓶


1.  質問リンク


https://www.acmicpc.net/problem/1052

2.  質問する



サマリ

  • 各水瓶には1 Lの水があり、志敏にはN個の水瓶がある.
  • 各水瓶は無限に水を注ぐことができる.
  • N個の水瓶を一緒に水和し、空でない水瓶の数がK個を超えないようにした.
  • に水を加えると、同じ数の水を含む2つの水瓶を1つの水瓶に統合します.
  • 上記の方法で非空水瓶をK個以下にした場合、購入する1 Lの水入り水瓶の最大値はいくらですか.
  • 入力
  • :第1行はNおよびKを与える.
  • 出力:購入しなければならない水瓶の最大値を出力します.
  • 3.  ソースコード

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    
    public class Main {
    	public int getBottleNum(int n, int k) {
    		int bottleNum = 0;
    		while(true) {
    			int temp = n + bottleNum;
    			int count = 0;
    			while(temp > 0) {
    				if(temp % 2 == 1) {
    					count++;
    				}
    				temp /= 2;
    			}
    			if(count <= k) {
    				break;
    			}
    			bottleNum++;
    		}
    		return bottleNum;
    	}
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		String input = br.readLine();
    		StringTokenizer st = new StringTokenizer(input);
    		int n = Integer.parseInt(st.nextToken());
    		int k = Integer.parseInt(st.nextToken());
    		br.close();
    		Main m = new Main();
    		bw.write(m.getBottleNum(n, k) + "\n");
    		bw.flush();
    		bw.close();
    	}
    }

    4.  に近づく


    以上の質問は以下の順序で回答します.
  • に入力されたNを1つの水瓶に統合する.等量の水瓶だけを合わせるので、2に分けて1つの水瓶に合わせます.
  • このプロセスに残りがある場合、countの値は1を加算します.ここでcountとは、空いていないバケツの数です.
  • のプロセスによって1つの水瓶に統合された後、非空きバケツのカウントが入力K以下である場合、条件を満たすため、上記プロセスの繰り返しが完了する.
  • countがKより大きい場合は、条件が満たされるまで繰り返し、1 Lの水瓶を1個ずつ繰り返し購入し、Nの値を1増加させる.