私はアルゴリズムとデータ構造 (1 か月で取得したもの) から試験のために学習していますが、この問題の効率的なアルゴリズムを見つけることはできません:
ライン上に 1 <= n <= 5000 ポイントが与えられます。各ポイントは、異なる自然座標 0 <= d <= 10^6 と (必ずしも異なるわけではありません) 自然ポイント時間0 <= t <= 10^9 秒を持ちます。任意の時点から開始して、1 秒ごとに現在の座標を +/-1 ずつ変更できます。問題は、ポイントタイムが経過する前にすべてのポイントが訪問されるような順序ですべてのポイントを訪問することです。この移動の最小合計時間 (秒単位) を見つけるか、不可能であると答えてください。
たとえば、与えられた 5 つのポイント (座標、ポイント-時間):
(1,3)、(3,1)、(5,6)、(8,19)、(10,15)、座標を訪れる旅行をするとき、それは可能です: 3 -> 1 -> 5 -> 8 -> 10、最小合計時間は 11 です。
私の最初のアイデアは、すべてのポイントを (ポイント-時間、座標) で辞書順に並べ替えてから、この順序でアクセスすることでした。もちろん、i 番目の点と (i+1) 番目の点の間に点がある場合は、(i+1) 番目の点を訪れる前にそれらの点を訪問することができます。しかし残念なことに、実装が難しいという事実にもかかわらず、そのような貪欲なアプローチが機能する理由についての議論はありません。多分私はそれをあまりにも早く解決しようとしていますか?n は小さいので、O(n^2) は問題ないと思います。
解決策を見つけるのに役立つかもしれないと考えて、入力の他の例を見つけました。しかし今では、考えられるすべての $n!$ 順列から 1 つの順列を見つけなければならないことがわかりました。
入力例:
ポイント(それぞれ座標、ポイント時間でも与えられます):(0,4)、(1,2)、(4,5):驚くべきことに(私は思う)それらを訪問する必要があります:0 -> 1 -> 4、なぜなら異なる順序は、問題テキストの最後の文の 1 つ前の条件を満たしません。
ポイント: (0,7), (1,2), (2,1), (3, 4), (4,11), 唯一のおかしな方法: 2 -> 1 -> 3 -> 0 -> 4、これには 10 秒かかります。
誰でも助けることができますか?