我有两个数组,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,等等,但是这个想法在这里)。