这是我要解决的问题,
给你一个有 2 行 N 列的表。每个单元格中都有一个整数。这样一个表的得分定义如下:对于每一列,考虑该列中两个数字的总和;这样获得的N个数字中的最大值就是分数。例如,对于表
7 1 6 2
1 2 3 4得分为 max(7 + 1; 1 + 2; 6 + 3; 2 + 4) = 9。表格的第一行是固定的,并作为输入给出。考虑了填充第二行的 N 种可能方法:
1个;2;: : : ; N
2; 3;: : : ; N; 1
3; 4;: : : ; N; 1个;2
|
N; 1个;: : : ; ; 氮1例如,对于上面的示例,我们将以下每一项都视为第二行的可能性。
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3你的任务是找出第二行的上述每个选项的分数。在上面的示例中,您将评估以下四个表,
7 1 6 2
1 2 3 4
7 1 6 2
2 3 4 1
7 1 6 2
3 4 1 2
7 1 6 2
4 1 2 3
分别计算得分 9、10、10 和 11测试数据:N <= 200000
时间限制:2 秒
这是显而易见的方法:
维护两个数组A,B,做以下n次
- 将每个元素 A[i] 添加到 B[i] 并保留一个变量 max 来存储迄今为止的最大值。
- 打印最大值
- 遍历数组 B[i] 并将所有元素加 1,如果任何元素等于 N,则将其设置为等于 1。
此方法将花费 O(n^2) 时间,外循环运行 N 次,并且有两个内循环,每个循环运行 N 次。
为了减少花费的时间,我们可以在第一行(在线性扫描中)找到最大元素 M,然后在 A[i] + N <= M + 1 时删除 A[i] 和 B[i]。
因为他们永远不会是最大的。
但是这种方法在平均情况下可能会表现得更好,最坏情况下的时间仍然是 O(N^2)。
为了在恒定时间内找到最大值,我还考虑使用堆,堆的每个元素都有两个属性,它们的原始值和要添加的值。但是,对于 n 种情况中的每一种,增加堆中所有元素的待添加值仍然需要线性时间。
所以时间仍然是O(N^2)
我无法找到比 N^2 时间更快地解决此问题的方法,因为 N 的值可能非常大,这将太慢。
任何帮助将不胜感激。