我有两个数组,a和b大小相同(比如k),我需要从a和b中找出一个值的第n个最小和。
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]));
        }
}

我无法理解这里的“n”的用法,我猜它是某种优化,因为没有这个“n”,剩下的解决方案是幼稚的。另外,我不确定它是否重要,但是n的约束是
1希望有人能帮忙。
来源:codechef的问题-LOWSUM

最佳答案

这就是说:
“如果对于某些给定的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,等等,但是这个想法在这里)。

10-07 18:50