查找范围(a,b)中小于(c,d)范围内的数字的整数数

时间:2016-10-06 05:53:40

标签: c++ algorithm

给出了四个数字(let:a,b,c,d)我们必须找到(a,b)之间小于(c,d)的整数数。

解决此问题的最有效方法是什么?

a,b,c,d是正整数。

我们必须找到a和b之间有多少个数字,这个数字小于c和d之间的数字。

输入: 1 2 3 3 4

输出: 3

输入: 1 2 999999 1 1000000

输出: 499998500001

简单搜索会超出时间限制。

简单搜索代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
int a,b,c,testCases,d;
cin >> testCases;
while(testCases--)
{
    int count=0;
    cin >> a >> b >> c >> d;
    for(int i=a;i<=b;i++)
    {
        for(int j=c;j<=d;j++)
        {
            if(j>i)
                count++;
        }
    }
    cout << count << endl;
}
return 0;
}

此代码提供超过时间限制&#34;信息。 我们必须减少它的时间复杂性。

2 个答案:

答案 0 :(得分:2)

答案就是

max(0, min(b, c) - a)

您不需要所有循环。

  • 如果b < c,然后a .. b中的每个数字都较小

  • 如果&lt; c&lt; b,然后...中的每个数字都较小

  • 如果c < a,那么没有数字更小

答案 1 :(得分:1)

可能正在寻找https://www.codechef.com/LTIME40/problems/LTM40AB

的解决方案

背后的真正诀窍在于给你的输入大小。对于给定的通过时间,这可以在O(n)中完成。这个解决方案适用于C ++ 4.8。

让我们查找范围[a,b]中的所有数字,并找出它与范围[c,d]相比的位置。可以有三种可能性:

  • a&lt; c:在这种情况下,将[c,d]范围内的所有数字添加到答案中。
  • a&gt; = c且a&lt; d:在这种情况下,将(d-a)添加到答案中,对应于范围[a + 1,d],因为现在您只能从此范围中选择数字。
  • a&gt; = d:没有选择。

或者,您可以尝试找到一个恒定时间解决方案(提示:尝试相对于范围[c,d]移动范围[a,b]并计算出重叠区域的长度)。考虑到范围的长度,可能会有棘手的测试用例。