给出了四个数字(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;信息。 我们必须减少它的时间复杂性。
答案 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]相比的位置。可以有三种可能性:
或者,您可以尝试找到一个恒定时间解决方案(提示:尝试相对于范围[c,d]移动范围[a,b]并计算出重叠区域的长度)。考虑到范围的长度,可能会有棘手的测试用例。