我有两个相同大小的A和B(比如k),我需要找到A中一个值和B中一个值的第n个最小和。例如,let A是[1,2,3],B是[4,5,6]。总和中有9个元素:
1 + 4 = 5;
2 + 4 = 6;
1 + 5 = 6;
1 + 6 = 7;
2 + 5 = 7;
3 + 4 = 7;
2 + 6 = 8;
3 + 5 = 8;
3 + 6 = 9;
如果我需要找到第四个最小的总和,我的答案是7。 一个涉及双循环的天真解决方案很容易找到,但我遇到了双循环的代码:
sort(a+1,a+k+1);
sort(b+1,b+k+1);
for(i=1; i<=k; i++)
{
n=10001/i; //WHY THIS LINE
ind=min(k,n); //WHY THIS LINE
v=a[i];
for(j=1; j<=ind; j++)
{
vc.push_back((v+b[j]));
}
}
我无法理解其使用情况&#39; n&#39;在这里我猜是某种优化,因为没有这个&#39; n&#39;,其余的解决方案是天真的。另外,我不确定它是否重要,但是n的约束是
1&lt; = k&lt; = 10000
希望有人可以提供帮助。
来源:CodeChef的一个问题 - LOWSUM
答案 0 :(得分:1)
所有这一切都是:
“对于某些给定的k
,如果k<=10000
- 最小的总和(a[i]+b[j]
)由i
构成,则j
不能更大比(k+1)/i
,所以它不能大于10001/i
“。因此,您只是不要寻找比j
更大的(10001)/i
来与给定的i
相关联。
这是因为您知道i
中与a
中的(k+1)/i
值相关联的最小b
值已经至少为您提供k+1
可能的总和,都小于a[i]
和b[j>(k+1)/i]
显然j
也不应大于k
,因为所有a[i]+b[j<=q]
都会更小。因此j
必须小于min(k, 10001/i)
。
(我没有正确检查我的平等案例,需要与否的+1,等等,但这个想法就在这里)。