由于 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 + 1a 之间正好有 b 个整数,其中正好 (b - a) / 2 + 1 是偶数(一半,四舍五入)。 如果 k 是奇数,或者在 a <= k <= b 范围之外,我们可以放心地忽略它。 如果 k 是偶数且介于 ab 之间,我们只需要从结果中减去 1。