由于 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,所有这些都不会改变结果。 这让我们只考虑偶数,从而简化了算法的其余部分。 在 ab 之间恰好有 b - a + 1 个整数,其中恰好有 (b - a) / 2 + 1 个整数(一半,四舍五入)。 如果 k 是奇数,或者超出范围 a <= k <= b,我们可以安全地忽略它。 如果 k 是偶数并且在 ab 之间,我们只需要从结果中减去一个。