如何解决由于 Hackerrank 超时
当我仅针对某些特定测试用例运行代码时,出现“因超时错误而终止”。即使我的代码为其他测试用例成功编译。有人可以帮我解决这个问题吗?
问题说明
能被2整除的数叫做偶数。
continue 是与 break 语句相反的循环控制语句,它不是终止循环,而是强制执行循环的下一次迭代。
Sohan 很想知道给定范围内的偶数总数,但他的朋友不喜欢数字。
输入格式
第一行将包含,测试用例的数量。 然后测试用例如下: 每个测试用例包含一行,其中包含三个数字 & .
约束
1
0
输出格式
样本输入 0
2
2 5 4
0 8 5
样本输出 0
1
5
说明 0
在第一个测试用例中: 2 只是偶数,除了 4 。 在第二个测试用例中: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;
}
解决方法
您的代码可以正常工作,但可以加快速度。
您的算法的复杂性 if 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,所有这些都不会改变结果。 通过让我们只考虑偶数,这简化了算法的其余部分。 在b - a + 1
和a
之间正好有b
个整数,其中正好(b - a) / 2 + 1
是偶数(一半,四舍五入)。 如果k
是奇数,或者在a <= k <= b
范围之外,我们可以放心地忽略它。 如果k
是偶数且介于a
和b
之间,我们只需要从结果中减去 1。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。