我正在尝试解决的问题是:给定一个有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; : : : ; ; N-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,该变量存储迄今为止的最大值。
打印max。
遍历数组B[i],如果任何元素等于N,则将所有元素增加1;如果任何元素等于N,则将其设置为1。
此方法将需要O(n^2)的时间,外循环运行N次,而内部有两个循环,每个循环都运行N次。
为了减少时间,我们可以在第一行中找到最大元素M(进行线性扫描),并在A[i]+N<=M+1时删除A[i]和B[i]。因为它们永远不会是最大值。
1; 2; : : : ; N 2; 3; : : : ; N; 1 3; 4; : : : ; N; 1; 2 | N; 1; : : : ; ; N-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,该变量存储迄今为止的最大值。
打印max。
遍历数组B[i],如果任何元素等于N,则将所有元素增加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的值可能非常大。
任何帮助都将不胜感激。