第10回ブルーブリッジカップjava-cグループスイープロボット

1.問題の説明:

Xiaoming Companyのオフィスエリアには、下の図に示すように、N個の正方形のエリアで構成される長い廊下があります。K掃引ロボットが廊下に配置され、そのうちi番目がAi番目のグリッド領域にあります。掃引ロボットは毎分左右の隣接するマス目に移動し、そのエリアを掃除できることが知られています。各ロボットの清掃ルートを計算するプログラムを作成して、すべてが開始スクエアに戻り、各スクエア領域が少なくとも1回クリーニングされるようにしてください。ロボットのアクションの開始から復帰までの時間は最短です。最後のロボット。複数のロボットが同時に同じ正方形の領域を掃除することができ、それらが互いに影響を与えることはないことに注意してください。
出力にかかる最小時間。上の図に示されている例では、費やされる最小時間は6です。最初のルート:2-1-2-3-4-3-2、エリア1、2、3、および4をクリアしました。2番目のルートは5-6-7-6-5で、5、6、および7がクリーニングされました。3番目のルート10-9-8-9-10、8、9、および10をクリーニングしました。
【入力形式】
1行目にはNとKの2つの整数が含まれています。次のK行では、各行に整数Aiがあります。
【出力形式】
回答を表す整数を出力します。
[サンプル入力] 10 3 5 2 10
[サンプル出力] 6
[評価ユースケースのスケールと規則]
評価ユースケースの30%について、1≤K<N≤10。評価のユースケースの60%で、1≤K<N≤1000。すべての評価ユースケースで、1≤K<N≤100000および1≤Ai≤N。

2.思考分析:

①最初は何も考えていなかったので、インターネットでブログを探してみたら、理解すれば解決できると思いました。c言語ネットワークでわかりやすいコードを見つけてPythonに変換しました。この質問への答えは、実際には、スイープタスクの完了後に最後のロボットが元の位置に戻るまでにかかる時間に依存します。したがって、K台のロボットは互いに協力する必要があります。K台のロボットによってクリーニングされた領域を平均した場合にのみ、使用時間この時間は最短です。、この時間は同時に働いているので。問題を分析すると、各ロボットが掃除できる最小領域の長さはmax(robots [0]、n // k)であり、最大長はnであることがわかります。したがって、この範囲の値は次のようになります。ロボットが掃除できる領域は質問の要件を満たすことができます(実際、バイナリ検索を使用して問題を解決でき、時間が短縮されます)

 ②私たちの戦略は、各ロボットの位置、クリーニング間隔の長さ、および左境界の位置に応じて、現在メソッドに渡されているクリーニング間隔の長さに応じて、次のロボットクリーニングの左境界を更新することです。 l(各ロボットは独自のクリーニングタスクを完了します)。したがって、最初に、左境界変数を宣言して、次のロボットの左境界を記録してクリーニングを開始する必要があります。左境界を更新する場合、次の場合に直接Falseを返すことができます。問題の条件が満たされていません。ループが終了したときロボットがクリーニングできる最大範囲をチェックして、N以上かどうかを確認します。満たされている場合はTrueを返し、そうでない場合はFalseを返します。

③現在の洗浄間隔の長さが質問の条件を満たしているかどうかを判断する場合、コアは次のコードです。

ロボットが境界の左側に表示される場合(L:境界、i:現在のロボットの添え字、Q:間隔サイズ)
L = i + Q-1
ロボットが境界の右側に表示される場合
L = i + Q-(iL)

④c言語ネットワークでコードテストできます

3.コードは次のとおりです。

from typing import List


def f(l: int, Q: int, robots: List[int]):
    for i in range(k):
        if robots[i] - Q <= l:
            if robots[i] <= l:
                l = robots[i] + Q - 1
            else:
                l = robots[i] + Q - (robots[i] - l)
        else:
            return False
    if l < n: return False
    return True


if __name__ == '__main__':
    n, k = map(int, input().split())
    robots = list()
    for i in range(k):
        robots.append(int(input()))
    robots.sort()
    Q = n // k if n // k >= robots[0] else robots[0]
    while Q <= n:
        l = 0
        if f(l, Q, robots): break
        Q += 1
    print(2 * (Q - 1))

 

おすすめ

転載: blog.csdn.net/qq_39445165/article/details/115035429