由于 Hackerrank 超时,我的提交未被接受
My submission is not accepted due to Timeout in Hackerrank
当我 运行 我的代码仅用于某些特定测试用例时,我得到了“由于超时错误而终止”。即使我的代码为其他测试用例编译成功。有人可以帮我解决这个问题吗?
问题陈述
能被 2 整除的数称为偶数。
Continue 是与 break 语句相反的循环控制语句,它不是终止循环,而是强制执行循环的下一次迭代。
Sohan 很想知道给定 运行ge 中偶数的总数,但他的朋友不喜欢数字。
输入格式
第一行将包含 , 个测试用例。
然后测试用例如下:
每个测试用例包含一行包含三个数字 & .
约束
1<=T<=10^5
0<=a,b,k<=10^8
输出格式
对于每个测试用例,输出一个整数,除 .
外 运行ge 中的总偶数
示例输入 0
2
2 5 4
0 8 5
示例输出 0
1
5
解释 0
在第一个测试用例中:除了 4 之外,2 只是偶数。
在第二个测试用例中:0,2,4,6,8
我的答案是:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b,k,i,count=0;
scanf("%d %d %d",&a,&b,&k);
for(i=a;i<=b;i++)
{
if(i%2==0)
{
if(i==k)
continue;
else
count+=1;
}
}
printf("%d\n",count);
}
return 0;
}
您的代码工作正常,但可以加快速度。
如果 O(n)
你的算法的复杂性意味着,在最坏的情况下,它将遍历 10^5 * 10^8 = 10^13
个数字。
根据一般经验,您的算法在此类问题中允许执行的最大操作数为 10^7
,因此您已超出限制。
这意味着您需要找到一种更好的算法,该算法能够计算结果而无需遍历所有数字。
尝试自己找到这些情况的答案( 不使用 使用您的程序!),您应该会注意到一个可以让您找到算法的模式。
请注意,我没有提到 k
- 一旦有了算法,事后添加它很容易。
a = 0, b = 100
a = 0, b = 10000
a = 3, b = 10000
a = 100, b = 200
a = 101, b = 20005
我在下面描述了一个算法的概要,但我鼓励您在揭露剧透之前尝试自己弄清楚问题。
你只关心偶数。这意味着当 a
为奇数时,我们可以将其加 1,而当 b
为奇数时,我们可以将其减 1,所有这些都不会改变结果。
这让我们只考虑偶数,从而简化了算法的其余部分。
在 a
和 b
之间恰好有 b - a + 1
个整数,其中恰好有 (b - a) / 2 + 1
个整数(一半,四舍五入)。
如果 k
是奇数,或者超出范围 a <= k <= b
,我们可以安全地忽略它。
如果 k
是偶数并且在 a
和 b
之间,我们只需要从结果中减去一个。
当我 运行 我的代码仅用于某些特定测试用例时,我得到了“由于超时错误而终止”。即使我的代码为其他测试用例编译成功。有人可以帮我解决这个问题吗?
问题陈述
能被 2 整除的数称为偶数。
Continue 是与 break 语句相反的循环控制语句,它不是终止循环,而是强制执行循环的下一次迭代。
Sohan 很想知道给定 运行ge 中偶数的总数,但他的朋友不喜欢数字。
输入格式
第一行将包含 , 个测试用例。 然后测试用例如下: 每个测试用例包含一行包含三个数字 & .
约束
1<=T<=10^5
0<=a,b,k<=10^8
输出格式
对于每个测试用例,输出一个整数,除 .
外 运行ge 中的总偶数示例输入 0
2
2 5 4
0 8 5
示例输出 0
1
5
解释 0
在第一个测试用例中:除了 4 之外,2 只是偶数。 在第二个测试用例中:0,2,4,6,8
我的答案是:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b,k,i,count=0;
scanf("%d %d %d",&a,&b,&k);
for(i=a;i<=b;i++)
{
if(i%2==0)
{
if(i==k)
continue;
else
count+=1;
}
}
printf("%d\n",count);
}
return 0;
}
您的代码工作正常,但可以加快速度。
如果 O(n)
你的算法的复杂性意味着,在最坏的情况下,它将遍历 10^5 * 10^8 = 10^13
个数字。
根据一般经验,您的算法在此类问题中允许执行的最大操作数为 10^7
,因此您已超出限制。
这意味着您需要找到一种更好的算法,该算法能够计算结果而无需遍历所有数字。
尝试自己找到这些情况的答案( 不使用 使用您的程序!),您应该会注意到一个可以让您找到算法的模式。
请注意,我没有提到 k
- 一旦有了算法,事后添加它很容易。
a = 0, b = 100
a = 0, b = 10000
a = 3, b = 10000
a = 100, b = 200
a = 101, b = 20005
我在下面描述了一个算法的概要,但我鼓励您在揭露剧透之前尝试自己弄清楚问题。
你只关心偶数。这意味着当
a
为奇数时,我们可以将其加 1,而当b
为奇数时,我们可以将其减 1,所有这些都不会改变结果。 这让我们只考虑偶数,从而简化了算法的其余部分。 在a
和b
之间恰好有b - a + 1
个整数,其中恰好有(b - a) / 2 + 1
个整数(一半,四舍五入)。 如果k
是奇数,或者超出范围a <= k <= b
,我们可以安全地忽略它。 如果k
是偶数并且在a
和b
之间,我们只需要从结果中减去一个。