配列内の各項目について、[-K、K] に数値を加算または減算すると厳密に昇順の配列になるように、正の最小数 K を見つける方法は?
例えば:
- 配列は[10、2、20]です
- 最小 K は 5 であり、考えられる結果は [10-5, 2+4, 20] です。
- 10-4 == 2+4 であるため、k = 4 は OK ではありません。配列を厳密な昇順に変換することはできません
私の推測は次のとおりです
define f(i, j) = a[i] - a[j] + ji-1 (i < j および a[i] > a[j] に必要: すべての逆順のペア)
最小 K は次の条件を満たす必要があります。
2*K > 最大 f(i,j)
ペア (i, j) が昇順でない場合、a[j] は最大で K しか加算できず、a[i] は最大で K を減算でき、a[i] とa[j] (厳密に昇順であるため)、(a[j] + K) - (a[i] - K) は (ji-1) (それらの間の長さ) より大きくなければなりません。
したがって、k >= 最大 f(i, j)/2 + 1
問題は、k = max f(i, j)/2 + 1 が OK かどうかを証明できないことです。
より多くの手がかり:
特定の K が十分かどうかを判断するアルゴリズムを見つけることを考えました。次に、アルゴリズムを使用して、可能な最小値から各 K を試して解を見つけることができます。
私は次のようなアルゴリズムを思いつきました:
for i in n->1 # n is array length
if i == n:
add K to a[i] # add the max to the last item won't affect order
else:
# the method is try to make a[i] as big as possible and still < a[i+1]
find a num k1 in [-K, K] to make a[i] to bottom closest to a[i+1]-1
if found:
add k1 to a[i]
else no k1 in [-K, K] can make a[i] < a[i+1]
return false
return true
私もそのようなアルゴリズムが正しいかどうか