{ }codelper
シミュレーションキューP0250

仕事がなければ向きを変えるエレベーター

エレベーター一台が 1 階から F 階までを上り下りする。
一度に K 人まで乗れる。
客は n 人いて、入力順に 1 番から n 番である。
i 番の客は t_i 分に a_i 階に来て、b_i 階へ行きたい。
エレベーターの方向は「上」「下」「停止」のどれかである。
時刻 0 分にエレベーターは 1 階で空であり、方向は「停止」である。
いまの時刻が T 分で、エレベーターが f 階にいるとき、次の五つの段階を順に行う。
段階 1:時刻 T に来た客が自分の階の列の最後に並ぶ。
同じ時刻に来た客は番号順に並ぶ。
段階 2:乗っている客のうち f 階へ行く客が全員降りる。
この客たちの到着時刻は T である。
段階 3:方向を決める。
「上の仕事」があるとは、f 階より上へ行く乗っている客、f 階より上の階で待っている客、f 階で待っていて上へ行きたい客のうち、一人でもいることをいう。
「下の仕事」も同じように下を見る。
- 方向が「上」で上の仕事があれば「上」のままにする。
上の仕事がなければ、下の仕事があるとき「下」に、ないとき「停止」に変える。
- 方向が「下」のときも同じである。
下の仕事があればそのままにし、なければ上の仕事があるとき「上」に、ないとき「停止」に変える。
- 方向が「停止」なら、いま待っている客のうち番号がいちばん小さい客 P を見る。
P が別の階にいれば P のいる階の方へ、P が f 階にいれば P が行きたい方へ方向を決める。
待っている客がいなければ「停止」のままにする。
近い客ではなく番号がいちばん小さい客である。
段階 4:方向が「停止」でなければ、f 階の列でその方向へ行きたい客が並んだ順に乗る。
乗っている人が K 人ならもう乗れない。
乗れなかった客と別の方向へ行きたい客は、並んだ順を保って待ち続ける。
段階 5:方向が「上」なら一階上がり、「下」なら一階下がって、時刻 T + 1 になる。
方向が「停止」ならその階にとどまり、次の客が来る時刻まで飛ばす。
すべての客が到着したら終わる。
一行目に F、K、n が、続く n 行に t_i、a_i、b_i が空白一つで区切られて与えられる。
客ごとに到着時刻を番号順に一行に一つずつ出力せよ。

入力
2 ≤ F ≤ 30、1 ≤ K ≤ 10、1 ≤ n ≤ 500、0 ≤ t_i ≤ 1,000,000、1 ≤ a_i, b_i ≤ F、a_i ≠ b_i(すべて整数)。
t_i は番号が大きくなっても減らない。
出力
n 行、客ごとの到着時刻
例 1 · stdin
6 2 5
0 1 4
0 3 1
1 2 5
2 5 3
2 6 5
stdout
3
10
4
8
6
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

規則を一段階ずつそのままコードに移すシミュレーションです。
階ごとの待ち行列(リストのリスト)と乗っている人のリストを持ち、毎分五つの段階を順に回します。
することがないときに 1 分ずつ数えると 100 万分を空回りするので、「停止」なら次の客が来る時刻へすぐ飛びます。
乗っている人のリストから降りる人を取り除く方法は言語ごとに違います:Python は内包表記で新しいリスト、JS・TS filter、Java は Iterator.remove()(for-each の中で list.remove するとたいてい ConcurrentModificationException)、C# は RemoveAll(p => …)(foreach の中で消すと InvalidOperationException)、C は残る人を配列の前に詰めて個数を減らす、C++20 std::erase_if、Craykon は残った人で新しいリストを作ります。
列から乗る人を外すときも、残った人の順番を保って新しい列を作ります。
落とし穴は六つ:① 行く方向を見ずに全員乗せると、逆へ行く客まで連れて行ってしまいます。
② 乗るのを降りるより先にすると満員のまま乗せようとして、その階で席が空くはずだったのに乗れません。
③ 停止中にいちばん近い客の方へ行くのは間違いです。
番号がいちばん小さい客の方です。
④ 端の階まで行ってから向きを変える(SCAN)のは間違いです。
この問題はもう仕事がなければその場で向きを変えます(LOOK)。
⑤ 席数を <= K で比べると一人多く乗ります。
⑥ 停止中に P が別の階にいるのに P の目的地の方へ出発すると、P を迎えに行きません。

Pythonmain.py · 59 行
import sys  def main():    data = sys.stdin.read().split()    floors, cap, n = int(data[0]), int(data[1]), int(data[2])    t = [int(data[3 + 3 * i]) for i in range(n)]    a = [int(data[4 + 3 * i]) for i in range(n)]    b = [int(data[5 + 3 * i]) for i in range(n)]    waiting = [[] for _ in range(floors + 1)]  # 층마다 기다리는 사람 번호(온 차례)    inside = []                                # 타고 있는 사람 번호    arrive = [0] * n    now, floor, direction = 0, 1, 0            # 방향: 1 위, -1 아래, 0 멈춤    nxt = done = 0    while done < n:        # 1) 이 시각에 온 사람이 줄을 선다        while nxt < n and t[nxt] == now:            waiting[a[nxt]].append(nxt)            nxt += 1        # 2) 내릴 사람이 내린다        for p in [p for p in inside if b[p] == floor]:            arrive[p] = now            done += 1        inside = [p for p in inside if b[p] != floor]        # 3) 방향을 정한다        up = any(b[p] > floor for p in inside) or any(waiting[g] for g in range(floor + 1, floors + 1)) \            or any(b[p] > floor for p in waiting[floor])        down = any(b[p] < floor for p in inside) or any(waiting[g] for g in range(1, floor)) \            or any(b[p] < floor for p in waiting[floor])        if direction == 1 and not up:            direction = -1 if down else 0        elif direction == -1 and not down:            direction = 1 if up else 0        elif direction == 0:            first = min((p for g in range(1, floors + 1) for p in waiting[g]), default=None)            if first is not None:                target = a[first] if a[first] != floor else b[first]                direction = 1 if target > floor else -1        # 4) 같은 방향으로 갈 사람이 온 차례대로, 자리가 있는 만큼 탄다        if direction != 0:            stay = []            for p in waiting[floor]:                if (b[p] - floor) * direction > 0 and len(inside) < cap:                    inside.append(p)                else:                    stay.append(p)            waiting[floor] = stay        if done == n:            break        # 5) 한 층 옮긴다. 할 일이 없으면 다음 사람이 올 때까지 건너뛴다        if direction == 0:            now = t[nxt]        else:            floor += direction            now += 1    print("\n".join(map(str, arrive)))  main()
JavaScriptmain.js · 55 行
const d = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [floors, cap, n] = d;const t = [], a = [], b = [];for (let i = 0; i < n; i++) {  t.push(d[3 + 3 * i]);  a.push(d[4 + 3 * i]);  b.push(d[5 + 3 * i]);}let waiting = Array.from({ length: floors + 1 }, () => []); // 층마다 기다리는 사람 번호(온 차례)let inside = []; // 타고 있는 사람 번호const arrive = new Array(n).fill(0);let now = 0, floor = 1, dir = 0; // 방향: 1 위, -1 아래, 0 멈춤let next = 0, done = 0;while (done < n) {  // 1) 이 시각에 온 사람이 줄을 선다  while (next < n && t[next] === now) waiting[a[next]].push(next++);  // 2) 내릴 사람이 내린다  for (const p of inside) if (b[p] === floor) { arrive[p] = now; done++; }  inside = inside.filter((p) => b[p] !== floor);  // 3) 방향을 정한다  let up = inside.some((p) => b[p] > floor) || waiting[floor].some((p) => b[p] > floor);  let down = inside.some((p) => b[p] < floor) || waiting[floor].some((p) => b[p] < floor);  for (let g = 1; g <= floors; g++) {    if (waiting[g].length === 0) continue;    if (g > floor) up = true;    if (g < floor) down = true;  }  if (dir === 1 && !up) dir = down ? -1 : 0;  else if (dir === -1 && !down) dir = up ? 1 : 0;  else if (dir === 0) {    let first = -1; // 기다리는 사람 가운데 가장 먼저 온 사람    for (let g = 1; g <= floors; g++) if (waiting[g].length > 0 && (first < 0 || waiting[g][0] < first)) first = waiting[g][0];    if (first >= 0) {      const target = a[first] !== floor ? a[first] : b[first];      dir = target > floor ? 1 : -1;    }  }  // 4) 같은 방향으로 갈 사람이 온 차례대로, 자리가 있는 만큼 탄다  if (dir !== 0) {    const stay = [];    for (const p of waiting[floor]) {      if ((b[p] - floor) * dir > 0 && inside.length < cap) inside.push(p);      else stay.push(p);    }    waiting[floor] = stay;  }  if (done === n) break;  // 5) 한 층 옮긴다. 할 일이 없으면 다음 사람이 올 때까지 건너뛴다  if (dir === 0) now = t[next];  else {    floor += dir;    now++;  }}console.log(arrive.join("\n"));
TypeScriptmain.ts · 55 行
const d: number[] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [floors, cap, n] = d;const t: number[] = [], a: number[] = [], b: number[] = [];for (let i = 0; i < n; i++) {  t.push(d[3 + 3 * i]);  a.push(d[4 + 3 * i]);  b.push(d[5 + 3 * i]);}let waiting: number[][] = Array.from({ length: floors + 1 }, () => []); // 층마다 기다리는 사람 번호(온 차례)let inside: number[] = []; // 타고 있는 사람 번호const arrive: number[] = new Array(n).fill(0);let now = 0, floor = 1, dir = 0; // 방향: 1 위, -1 아래, 0 멈춤let next = 0, done = 0;while (done < n) {  // 1) 이 시각에 온 사람이 줄을 선다  while (next < n && t[next] === now) waiting[a[next]].push(next++);  // 2) 내릴 사람이 내린다  for (const p of inside) if (b[p] === floor) { arrive[p] = now; done++; }  inside = inside.filter((p) => b[p] !== floor);  // 3) 방향을 정한다  let up = inside.some((p) => b[p] > floor) || waiting[floor].some((p) => b[p] > floor);  let down = inside.some((p) => b[p] < floor) || waiting[floor].some((p) => b[p] < floor);  for (let g = 1; g <= floors; g++) {    if (waiting[g].length === 0) continue;    if (g > floor) up = true;    if (g < floor) down = true;  }  if (dir === 1 && !up) dir = down ? -1 : 0;  else if (dir === -1 && !down) dir = up ? 1 : 0;  else if (dir === 0) {    let first = -1; // 기다리는 사람 가운데 가장 먼저 온 사람    for (let g = 1; g <= floors; g++) if (waiting[g].length > 0 && (first < 0 || waiting[g][0] < first)) first = waiting[g][0];    if (first >= 0) {      const target = a[first] !== floor ? a[first] : b[first];      dir = target > floor ? 1 : -1;    }  }  // 4) 같은 방향으로 갈 사람이 온 차례대로, 자리가 있는 만큼 탄다  if (dir !== 0) {    const stay: number[] = [];    for (const p of waiting[floor]) {      if ((b[p] - floor) * dir > 0 && inside.length < cap) inside.push(p);      else stay.push(p);    }    waiting[floor] = stay;  }  if (done === n) break;  // 5) 한 층 옮긴다. 할 일이 없으면 다음 사람이 올 때까지 건너뛴다  if (dir === 0) now = t[next];  else {    floor += dir;    now++;  }}console.log(arrive.join("\n"));
JavaMain.java · 83 行
import java.io.*;import java.util.*; public class Main {    public static void main(String[] args) throws IOException {        StreamTokenizer in = new StreamTokenizer(new BufferedInputStream(System.in));        in.nextToken(); int floors = (int) in.nval;        in.nextToken(); int cap = (int) in.nval;        in.nextToken(); int n = (int) in.nval;        int[] t = new int[n], a = new int[n], b = new int[n];        for (int i = 0; i < n; i++) {            in.nextToken(); t[i] = (int) in.nval;            in.nextToken(); a[i] = (int) in.nval;            in.nextToken(); b[i] = (int) in.nval;        }        List<List<Integer>> waiting = new ArrayList<>(); // 층마다 기다리는 사람 번호(온 차례)        for (int g = 0; g <= floors; g++) waiting.add(new ArrayList<>());        List<Integer> inside = new ArrayList<>();        int[] arrive = new int[n];        int now = 0, floor = 1, dir = 0; // 방향: 1 위, -1 아래, 0 멈춤        int next = 0, done = 0;        while (done < n) {            // 1) 이 시각에 온 사람이 줄을 선다            while (next < n && t[next] == now) waiting.get(a[next]).add(next++);            // 2) 내릴 사람이 내린다            for (Iterator<Integer> it = inside.iterator(); it.hasNext(); ) {                int p = it.next();                if (b[p] == floor) {                    arrive[p] = now;                    done++;                    it.remove();                }            }            // 3) 방향을 정한다            boolean up = false, down = false;            for (int p : inside) {                if (b[p] > floor) up = true;                if (b[p] < floor) down = true;            }            for (int p : waiting.get(floor)) {                if (b[p] > floor) up = true;                if (b[p] < floor) down = true;            }            for (int g = 1; g <= floors; g++) {                if (waiting.get(g).isEmpty()) continue;                if (g > floor) up = true;                if (g < floor) down = true;            }            if (dir == 1 && !up) dir = down ? -1 : 0;            else if (dir == -1 && !down) dir = up ? 1 : 0;            else if (dir == 0) {                int first = -1;                for (int g = 1; g <= floors; g++) {                    List<Integer> w = waiting.get(g);                    if (!w.isEmpty() && (first < 0 || w.get(0) < first)) first = w.get(0);                }                if (first >= 0) {                    int target = a[first] != floor ? a[first] : b[first];                    dir = target > floor ? 1 : -1;                }            }            // 4) 같은 방향으로 갈 사람이 온 차례대로, 자리가 있는 만큼 탄다            if (dir != 0) {                List<Integer> stay = new ArrayList<>();                for (int p : waiting.get(floor)) {                    if ((b[p] - floor) * dir > 0 && inside.size() < cap) inside.add(p);                    else stay.add(p);                }                waiting.set(floor, stay);            }            if (done == n) break;            // 5) 한 층 옮긴다. 할 일이 없으면 다음 사람이 올 때까지 건너뛴다            if (dir == 0) now = t[next];            else {                floor += dir;                now++;            }        }        StringBuilder sb = new StringBuilder();        for (int x : arrive) sb.append(x).append('\n');        System.out.print(sb);    }}
C#Main.cs · 75 行
using System;using System.Collections.Generic;using System.Text; class Program{    static void Main()    {        var d = Array.ConvertAll(Console.In.ReadToEnd().Split((char[])null, StringSplitOptions.RemoveEmptyEntries), int.Parse);        int floors = d[0], cap = d[1], n = d[2];        int[] t = new int[n], a = new int[n], b = new int[n];        for (int i = 0; i < n; i++)        {            t[i] = d[3 + 3 * i];            a[i] = d[4 + 3 * i];            b[i] = d[5 + 3 * i];        }        var waiting = new List<int>[floors + 1]; // 층마다 기다리는 사람 번호(온 차례)        for (int g = 0; g <= floors; g++) waiting[g] = new List<int>();        var inside = new List<int>();        var arrive = new int[n];        int now = 0, floor = 1, dir = 0; // 방향: 1 위, -1 아래, 0 멈춤        int next = 0, done = 0;        while (done < n)        {            // 1) 이 시각에 온 사람이 줄을 선다            while (next < n && t[next] == now) { waiting[a[next]].Add(next); next++; }            // 2) 내릴 사람이 내린다            foreach (int p in inside)                if (b[p] == floor) { arrive[p] = now; done++; }            inside.RemoveAll(p => b[p] == floor);            // 3) 방향을 정한다            bool up = false, down = false;            foreach (int p in inside) { if (b[p] > floor) up = true; if (b[p] < floor) down = true; }            foreach (int p in waiting[floor]) { if (b[p] > floor) up = true; if (b[p] < floor) down = true; }            for (int g = 1; g <= floors; g++)            {                if (waiting[g].Count == 0) continue;                if (g > floor) up = true;                if (g < floor) down = true;            }            if (dir == 1 && !up) dir = down ? -1 : 0;            else if (dir == -1 && !down) dir = up ? 1 : 0;            else if (dir == 0)            {                int first = -1;                for (int g = 1; g <= floors; g++)                    if (waiting[g].Count > 0 && (first < 0 || waiting[g][0] < first)) first = waiting[g][0];                if (first >= 0)                {                    int target = a[first] != floor ? a[first] : b[first];                    dir = target > floor ? 1 : -1;                }            }            // 4) 같은 방향으로 갈 사람이 온 차례대로, 자리가 있는 만큼 탄다            if (dir != 0)            {                var stay = new List<int>();                foreach (int p in waiting[floor])                {                    if ((b[p] - floor) * dir > 0 && inside.Count < cap) inside.Add(p);                    else stay.Add(p);                }                waiting[floor] = stay;            }            if (done == n) break;            // 5) 한 층 옮긴다. 할 일이 없으면 다음 사람이 올 때까지 건너뛴다            if (dir == 0) now = t[next];            else { floor += dir; now++; }        }        var sb = new StringBuilder();        foreach (int x in arrive) sb.Append(x).Append('\n');        Console.Write(sb);    }}
C++main.cpp · 59 行
#include <algorithm>#include <iostream>#include <vector> int main() {    std::ios::sync_with_stdio(false);    std::cin.tie(nullptr);    int floors, cap, n;    std::cin >> floors >> cap >> n;    std::vector<int> t(n), a(n), b(n), arrive(n);    for (int i = 0; i < n; i++) std::cin >> t[i] >> a[i] >> b[i];    std::vector<std::vector<int>> waiting(floors + 1); // 층마다 기다리는 사람 번호(온 차례)    std::vector<int> inside;    int now = 0, floor = 1, dir = 0; // 방향: 1 위, -1 아래, 0 멈춤    int next = 0, done = 0;    while (done < n) {        // 1) 이 시각에 온 사람이 줄을 선다        while (next < n && t[next] == now) waiting[a[next]].push_back(next), next++;        // 2) 내릴 사람이 내린다        for (int p : inside)            if (b[p] == floor) arrive[p] = now, done++;        std::erase_if(inside, [&](int p) { return b[p] == floor; });        // 3) 방향을 정한다        bool up = false, down = false;        for (int p : inside) up |= b[p] > floor, down |= b[p] < floor;        for (int p : waiting[floor]) up |= b[p] > floor, down |= b[p] < floor;        for (int g = 1; g <= floors; g++) {            if (waiting[g].empty()) continue;            if (g > floor) up = true;            if (g < floor) down = true;        }        if (dir == 1 && !up) dir = down ? -1 : 0;        else if (dir == -1 && !down) dir = up ? 1 : 0;        else if (dir == 0) {            int first = -1;            for (int g = 1; g <= floors; g++)                if (!waiting[g].empty() && (first < 0 || waiting[g][0] < first)) first = waiting[g][0];            if (first >= 0) {                int target = a[first] != floor ? a[first] : b[first];                dir = target > floor ? 1 : -1;            }        }        // 4) 같은 방향으로 갈 사람이 온 차례대로, 자리가 있는 만큼 탄다        if (dir != 0) {            std::vector<int> stay;            for (int p : waiting[floor]) {                if ((b[p] - floor) * dir > 0 && (int)inside.size() < cap) inside.push_back(p);                else stay.push_back(p);            }            waiting[floor] = stay;        }        if (done == n) break;        // 5) 한 층 옮긴다. 할 일이 없으면 다음 사람이 올 때까지 건너뛴다        if (dir == 0) now = t[next];        else floor += dir, now++;    }    for (int x : arrive) std::cout << x << '\n';    return 0;}
Cmain.c · 83 行
#include <stdio.h> #define MAXN 500#define MAXF 30 static int t[MAXN], a[MAXN], b[MAXN], arrive[MAXN];static int waiting[MAXF + 1][MAXN]; /* 층마다 기다리는 사람 번호(온 차례) */static int wcount[MAXF + 1];static int inside[10], icount = 0;  /* 타고 있는 사람 번호 */ int main(void) {    int floors, cap, n;    scanf("%d %d %d", &floors, &cap, &n);    for (int i = 0; i < n; i++) scanf("%d %d %d", &t[i], &a[i], &b[i]);    int now = 0, floor = 1, dir = 0; /* 방향: 1 위, -1 아래, 0 멈춤 */    int next = 0, done = 0;    while (done < n) {        /* 1) 이 시각에 온 사람이 줄을 선다 */        while (next < n && t[next] == now) {            waiting[a[next]][wcount[a[next]]++] = next;            next++;        }        /* 2) 내릴 사람이 내린다(남는 사람은 앞으로 당겨 담는다) */        int k = 0;        for (int j = 0; j < icount; j++) {            int p = inside[j];            if (b[p] == floor) {                arrive[p] = now;                done++;            } else {                inside[k++] = p;            }        }        icount = k;        /* 3) 방향을 정한다 */        int up = 0, down = 0;        for (int j = 0; j < icount; j++) {            if (b[inside[j]] > floor) up = 1;            if (b[inside[j]] < floor) down = 1;        }        for (int j = 0; j < wcount[floor]; j++) {            if (b[waiting[floor][j]] > floor) up = 1;            if (b[waiting[floor][j]] < floor) down = 1;        }        for (int g = 1; g <= floors; g++) {            if (wcount[g] == 0) continue;            if (g > floor) up = 1;            if (g < floor) down = 1;        }        if (dir == 1 && !up) dir = down ? -1 : 0;        else if (dir == -1 && !down) dir = up ? 1 : 0;        else if (dir == 0) {            int first = -1;            for (int g = 1; g <= floors; g++)                if (wcount[g] > 0 && (first < 0 || waiting[g][0] < first)) first = waiting[g][0];            if (first >= 0) {                int target = a[first] != floor ? a[first] : b[first];                dir = target > floor ? 1 : -1;            }        }        /* 4) 같은 방향으로 갈 사람이 온 차례대로, 자리가 있는 만큼 탄다 */        if (dir != 0) {            int *w = waiting[floor];            k = 0;            for (int j = 0; j < wcount[floor]; j++) {                int p = w[j];                if ((b[p] - floor) * dir > 0 && icount < cap) inside[icount++] = p;                else w[k++] = p;            }            wcount[floor] = k;        }        if (done == n) break;        /* 5) 한 층 옮긴다. 할 일이 없으면 다음 사람이 올 때까지 건너뛴다 */        if (dir == 0) {            now = t[next];        } else {            floor += dir;            now++;        }    }    for (int i = 0; i < n; i++) printf("%d\n", arrive[i]);    return 0;}
Craykonmain.cray · 146 行
첫줄 = コンソール.数読み();floors = 첫줄[0];cap = 첫줄[1];n = 첫줄[2];t = [];a = [];b = [];繰り返す (i = 0; i < n; i++){    p = コンソール.数読み();    t.追加(p[0]);    a.追加(p[1]);    b.追加(p[2]);}waiting = []; // 층마다 기다리는 사람 번호(온 차례)繰り返す (g = 0; g <= floors; g++){    waiting.追加([]);}inside = []; // 타고 있는 사람 번호arrive = 新リスト(n, 0);now = 0;floor = 1;dir = 0; // 방향: 1 위, -1 아래, 0 멈춤next = 0;done = 0;間 (done < n){    // 1) 이 시각에 온 사람이 줄을 선다    間 (next < n && t[next] == now)    {        waiting[a[next]].追加(next);        next++;    }    // 2) 내릴 사람이 내린다    남은 = [];    それぞれ (p の中 inside)    {        もし (b[p] == floor)        {            arrive[p] = now;            done++;        }        でなければ        {            남은.追加(p);        }    }    inside = 남은;    // 3) 방향을 정한다    up = 偽;    down = 偽;    それぞれ (p の中 inside)    {        もし (b[p] > floor)        {            up = 真;        }        もし (b[p] < floor)        {            down = 真;        }    }    それぞれ (p の中 waiting[floor])    {        もし (b[p] > floor)        {            up = 真;        }        もし (b[p] < floor)        {            down = 真;        }    }    繰り返す (g = 1; g <= floors; g++)    {        もし (waiting[g].個数 > 0 && g > floor)        {            up = 真;        }        もし (waiting[g].個数 > 0 && g < floor)        {            down = 真;        }    }    もし (dir == 1 && !up)    {        dir = down ? -1 : 0;    }    でなければ もし (dir == -1 && !down)    {        dir = up ? 1 : 0;    }    でなければ もし (dir == 0)    {        first = -1; // 기다리는 사람 가운데 가장 먼저 온 사람        繰り返す (g = 1; g <= floors; g++)        {            もし (waiting[g].個数 > 0 && (first < 0 || waiting[g][0] < first))            {                first = waiting[g][0];            }        }        もし (first >= 0)        {            target = a[first];            もし (target == floor)            {                target = b[first];            }            dir = target > floor ? 1 : -1;        }    }    // 4) 같은 방향으로 갈 사람이 온 차례대로, 자리가 있는 만큼 탄다    もし (dir != 0)    {        stay = [];        それぞれ (p の中 waiting[floor])        {            もし ((b[p] - floor) * dir > 0 && inside.個数 < cap)            {                inside.追加(p);            }            でなければ            {                stay.追加(p);            }        }        waiting[floor] = stay;    }    もし (done == n)    {        抜ける;    }    // 5) 한 층 옮긴다. 할 일이 없으면 다음 사람이 올 때까지 건너뛴다    もし (dir == 0)    {        now = t[next];    }    でなければ    {        floor = floor + dir;        now++;    }}コンソール.書く(arrive.つなぐ("\n"));