ブリッジトラック


リンクテキスト

もんだいぶんせき


何台ものトラックが川にまたがる橋を所定の順序で渡りたいと思っている.すべてのトラックが橋を渡るのに少なくとも数秒かかります.橋の上で、トラックは最大bridge lengthロッドに乗ることができ、橋は重量より低い重量に耐えることができる.しかし、完全に橋を上がっていないトラックの重さは無視される.
例えば、2台のトラックに乗ることができ、10キロの重量に耐えられる橋があります.重量[7,4,5,6]kgのトラックは最短時間で順番に橋を渡りますので、次のように橋を渡ります.
ブリッジカー
0 [][] [7,4,5,6]
1~2 [][7] [4,5,6]
3 [7][4] [5,6]
4 [7][4,5] [6]
5 [7,4][5] [6]
6~7 [7,4,5][6] []
8 [7,4,5,6][] []

自分の解釈


私が問題に対する理解度がまだ低いせいか、問題自体が理解するのに時間がかかる.その結果、脚という条件で、重量や長さに応じてカットしてカウントするという問題があった.

Python

def solution(bridge_length, weight, truck_weights):
    bridge = [0]*bridge_length
    print(bridge)
    time =0
    while bridge:
        time +=1
        bridge.pop(0)
        
        if truck_weights:
            if truck_weights[0]+ sum(bridge) <= weight:
                bridge.append(truck_weights.pop(0))   
            else:   
                bridge.append(0)
                
    return time
易しく解くには、本当に易しい問題だ.本当はqueueを利用して何かしたいのですが、時間がかかりすぎるので、簡単なリストで行います.最初は、足を所定の長さにして作り、それから巡回して、実際に問題の過程を体現してカウントしました.これよりもっといい方法があるに違いない...

C++

#include <string>
#include <vector>
#include <deque>
using namespace std;
int summa(deque<int> bridge){
    int sum = 0;
    while(bridge.size()){
        sum += bridge.front();
        bridge.pop_front();
    }
    return sum;
}

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    deque<int> bridge(bridge_length);
    int time =0;
    while(bridge.size()){
        time ++;
        bridge.pop_front();
        if(truck_weights.size()){
            if(truck_weights.front() + summa(bridge) <= weight){
                bridge.push_back(truck_weights.front());
                truck_weights.erase(truck_weights.begin());
            }
            else{
                bridge.push_back(0);
            }
        }
    }
    return time;
        
}
CPP君は...最初からすべて実現...まず,基本論理は取得に似ているがsum()のような関数を作成する必要がある.