【问题标题】:My submission is not accepted due to Timeout in Hackerrank由于 Hackerrank 超时,我的提交没有被接受
【发布时间】:2021-02-23 03:39:08
【问题描述】:

当我仅针对某些特定测试用例运行代码时,我得到了“因超时错误而终止”。即使我的代码为其他测试用例成功编译。有人可以帮我解决这个问题吗?

问题陈述
能被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;
}

【问题讨论】:

  • 提示:你不需要为每个测试用例循环。
  • @dbush 我是新手,你能帮我写什么吗?
  • 在给定的数字范围内,你可以计算出有多少个偶数。
  • @dbush 我尝试了所有方法,但找不到方法,请您提供算法或代码。
  • 试了这么多次,终于解决了。谢谢@dbush

标签: c timeout time-complexity terminate


【解决方案1】:

您的代码可以正常工作,但可以加快速度。 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 &lt;= k &lt;= b 的范围,我们可以放心地忽略它。 如果k 是偶数并且在ab 之间,我们只需从结果中减去一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2018-10-22
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多