4

私はこの問題を解決しようとしています: http://acm.tju.edu.cn/toj/showp2886.html

いくつかの解決策を試しましたが、そのうちの 2 つについて説明します。両方とも、コスト (位置) が凸関数であると仮定していることに注意してください。つまり、中央に向かって減少し (実際には、中央値 (供給ポイント) に向かってどこか)、グラフは多かれ少なかれ U 字型のように見えます。

  1. cost(position) <= M である供給ポイントの左端と右端の位置を見つけます。最小値と最大値を見つけた後、間隔を少し大きくできるかどうかを確認します (レストランは場所である必要はないため)。正確に供給ポイントに)。これは良い解決策ですが、最後のビットを計算するのに非常に時間がかかります。M が非常に大きく、最小コストの供給ポイントがほとんどないテストでは失敗します。複雑さ: O(NlogN) + O(M)。以下のこの解決策はそのままで時間制限を超えていますが、O(1) で両方向にどれだけ移動できるかを計算する別の解決策を試してみましたが、間違った答えが得られました。

  2. この関数は凸関数であるため、三項検索を使用して最小値を見つけることができます。最小値が M 未満の場合、関数の下限と上限 (つまり M) をバイナリ検索します。複雑さ: O(NlogM) すべての O(logM) に対して、O(N) でコストを計算するためです。

これは私が試したものであり、まだ「間違った答え」が得られるので、これが私を狂わせているので、助けが必要です.

最初にそれを読んだとき、コストがすべての供給ポイントから計算されたのではなく、最も近いものから計算されたと思ったので、問題は仕様で実際には明確ではありません (少なくとも私はそう思います)。例はそれをクリアしました。また、コスト(位置)関数が凸であるという私の仮定が本当に正しいかどうかもわかりません。しかし、私は多くの例を試しましたが、そうです。

ありがとう。どんな助けでも大歓迎です。:D

4

1 に答える 1

1

リスト内の 2 つの連続したサプライヤーの場所の間の最小目標値は、2 つのサプライヤーの場所のいずれかで発生する必要があります。これを確認するには、間にサプライヤーの場所がなく、その場所の違いが 1 を超えている 2 つのサプライヤーの場所を考えます。左側のサプライヤーの場所が、右側のサプライヤーの場所よりも低いか等しい目標値を与えるとします。次に、左側のサプライヤーの場所から開始して右に 1 ステップ移動するたびに、目的関数が上昇します (弱い場合、一定のままである可​​能性があります)。 2 つの連続するサプライヤーの場所の間の時間。したがって、計算する必要があるのは、同じグローバル最小値を提供するサプライヤーの場所の数だけです。

私の分析によると、2 つの連続していないセグメントが同じグローバル最小目標値を与える可能性があることに注意してください。もしそうなら、あなたの関数は凸ではないかもしれず、これがあなたの現在の試みにおけるあなたの問題の原因かもしれません.

各サプライヤーの場所での目標値の計算は、左から右に処理することにより、N のサプライヤーに対して O(N) 時間で実行できます。

于 2015-04-15T17:56:31.620 に答える