[BOJ]200055号:コンベアのロボット(Java)


質問する (Gold 5)


20055号:コンベアのロボット

に答える


問題は本当に理解しにくいですが、
他よりも、急に出力される単語「手順」が何なのか、いくつかの例を見て知るようです.
ここで、1〜4のルーチンを1つのステップと呼び、終了前に合計何回のステップが経過したかを求めることができる.
最初は仕事順に並べられた1,2,3,4が1段階を表すと思っていましたが、
1番目の出力は「2番目」ステップ、すなわち「最初にベルトをつける~」だと思います.問題のあいまいな点が多すぎる💦
問題自体が混同されているほか,通常のシミュレーション問題のように,逐一実施すればよい.

オーダー

  • Beltという保存耐久性とロボットの有無のクラスが作成されました.
    ❗ロボットは1つの格しか上がらない.したがって、ブールタイプ宣言!
  • [1番シーケンス]コンベアを配列させ、コンベアの回転を配列の回転として体現させる.
    値を0からi+1にコピーすると、値は繰り返しコピーされます.つまりconv[0]の値で、すべての配列がブラシで表示されます!
    そのため、2*N-1からiを減らして値をコピーします!
  • [1番順]ベルトを回すと、N-1インデックスのロボットが無条件にfalseに変更されます.
  • [2番順] 最初のベルトアップオートマトンのナビゲート->i-1~0ベルトアレイ
    ❗「真っ先に上がった」に騙されないように、別の順番をメモ!
    どうせN~2 N-1までロボットはいなかったし、最後に一番右(N-1に近い)の子が一番古い子!
  • [2番順]コンベア回転のようにロボットを移動し、N-1インデックスのロボットは無条件false! 
  • 問題は理解しにくく、条件が過酷で雑然としていて、問題、💦

    コード#コード#

    package simulation;
    
    import java.util.*;
    import java.io.*;
    
    public class BOJ_20055_컨베이어벨트위의로봇 {
        static class Belt{
            int power;
            boolean robot;
            public Belt(int power) {
                this.power = power;
                this.robot = false;
            }
        }
        static int N, K;
        static Belt[] conv;
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            K = Integer.parseInt(st.nextToken());
            conv = new Belt[2*N];
            st = new StringTokenizer(br.readLine());
            for(int i =0 ; i < 2*N ; i++){
                conv[i] = new Belt(Integer.parseInt(st.nextToken()));
            }
    
            int stage = 1;
            while(true){
                // 1. 회전
                int p = conv[2*N-1].power;
                boolean r = conv[2*N-1].robot;
                for(int i = 2*N-1 ; i > 0 ; i--){
                    conv[i].power = conv[i-1].power;
                    conv[i].robot = conv[i-1].robot;
                }
                conv[0].power = p;
                conv[0].robot = r;
                conv[N-1].robot = false;
    
                // 2. 가장 먼저 올라간 로봇부터, 이동
                for(int i = N-1 ; i > 0 ; i--){
                    if(!conv[i].robot && conv[i-1].robot && conv[i].power >= 1){
                        conv[i].power --;
                        conv[i].robot = true;
                        conv[i-1].robot = false;
                    }
                }
                conv[0].robot = false;
                conv[N-1].robot = false;
    
                // 3. 올리는 위치에 로봇 올림
                if(conv[0].power != 0){
                    conv[0].robot = true;
                    conv[0].power --;
                }
                if(!isValid()) break;
                stage++;
            }
            System.out.println(stage);
        }
    
        private static boolean isValid() {
            int cnt = 0;
            for(int i = 0 ; i < 2*N ; i++){
                if(conv[i].power <= 0) cnt++;
            }
            return cnt < K;
        }
    }

    送信



    特に反例はなく、問題をよく理解し、例題さえ正しければ、合格すればいい.