[プログラマー]42583号:ブリッジトラック




コード#コード#

import java.util.LinkedList;
import java.util.Queue;

public class PRO_42583 {
    public static int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> queue = new LinkedList<>();
        int sum = 0;
        int time = 0;

        for (int i = 0; i < truck_weights.length; i++) {
            int truck = truck_weights[i];

            while (true) {
                if (queue.isEmpty()) {
                    queue.add(truck);
                    sum += truck;
                    ++time;
                    break;
                } else if (queue.size() == bridge_length) {
                    sum -= queue.poll();
                } else {
                    if (sum + truck <= weight) {
                        queue.add(truck);
                        sum += truck;
                        ++time;
                        break;
                    } else {
                        queue.add(0);
                        ++time;
                    }
                }
            }
        }
        return time + bridge_length;
    }

    public static void main(String[] args) {
        int bridge_length = 2;
        int weight = 10;
        int[] truck_weights = {7, 4, 5, 6};

        System.out.println(solution(bridge_length, weight, truck_weights));
    }
}

答えと感じ


キューを利用して問題に近づいた.
橋の上にトラックを置く条件は全部で3種類ある.
  • キューが空の場合
  • キューが満たされていない場合は
  • です.
  • キューがいっぱいの場合は
  • です.
    キューが空の場合はトラックに入れ、トラックの重量を格納する合計値まで増やします.そして時間が1増加します.
    キューが不満の場合は、2つのケースに分けられます.トラックを追加すると、橋の長さを超える場合があり、逆も同様です.超えた場合は、0を加えると、時間が1増加します.超えなければ、追加のトラックの重量をsumに加えて1時間増やします.
    列がいっぱいの場合は、前のトラックを取り外し、sumから前のトラックの重量を減算します.
    正解を出力するとき、時間に橋の長さを加えるのは、最後のトラックが橋を渡る時間を加えるからです.ドアの最後のトラックのことしか考えていないので、帰りにも考えたことがあります.

    参考資料