无法弄清楚这种用法的逻辑

时间:2018-01-05 14:30:00

标签: algorithm optimization

我有两个相同大小的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

1 个答案:

答案 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,等等,但这个想法就在这里)。