【问题标题】:make array strictly increasing使数组严格增加
【发布时间】:2021-05-29 16:51:05
【问题描述】:
假设给定一个大小为 n 的序列。我们必须使这个序列严格递增。我们可以执行任何操作。即选择任意两个相邻元素 A(i) 和 A(i+1) 并将其中一个替换为 (A(i)+A(i+1))/2 (实数,即不四舍五入)。您还可以在多次操作中选择每对相邻元素和要替换的每个元素,即任意次数。
我们必须知道是否有可能使序列严格递增?
两种可能性是如果数组的大小是 2 并且第一个元素大于 2nd 。那么不可能。
另一种可能性是如果它包含相同的元素。那么不可能。
是否还有其他无法回答的可能性。
【问题讨论】:
标签:
arrays
algorithm
sorting
math
【解决方案1】:
观察 1: 如果有两个相邻的数 j,j 和 i > j,不使用任何其他数 k 就无法到达 i
观察2:如果有两个数i,j和ik+1 = (i + jk sub>) 足够的次数,你可以得到 j = i + c,其中 c 是任意小的。
或者,你可以做相反的事情(例如,放大 i 以便任意接近 j)。
第二次观察的后果:
如果 first 元素小于 last 元素,您可以创建序列:
- 首先使除第一个元素之外的所有元素尽可能接近最后一个数字。这给了我们 i 1, j+c2 ... j+cx, j 的序列,其中每个 | c|接近于零。
- 现在使用 i 来制作递增序列:i, (i + j)/2, ((i + j)/2 + j)/2 ... j。由于 c 可以任意小,因此不会很重要。如果您的序列需要很长,您可能还需要对 i、((i+j) / 2 + i) / 2 等序列多次执行这些步骤。
上一步的结果:
只要有两个数字按升序排列,就可以排序:
- 将较小的数字平均到第一位。
- 将较大的数字平均到最后一个位置。
- 应用上一步。
观察 1 的结果:
如果数字处于递减或弱递减(非递增)顺序,则无法通过平均操作将它们重新排序为递增顺序。