在hackerrank中因超时而终止[关闭]
Posted
技术标签:
【中文标题】在hackerrank中因超时而终止[关闭]【英文标题】:Terminated due timeout in hackerrank [closed] 【发布时间】:2018-03-26 21:19:04 【问题描述】:我的代码是 C++ 并且目前正在努力完成任务。下面给出的链接
难度:中等
我的算法适用于 20 个测试用例中的 18 个。 其他 2 个因超时而终止。
我知道这意味着什么,但现在我不知道如何提高算法的效率。
我在下面给出了我的代码,任何人都可以帮我解决这个问题 https://www.hackerrank.com/challenges/and-product
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
int t;
unsigned long int x,y,a;
cin>>t;
while(t)
cin>>x>>y;
a=x;
for(;x<=y;x++)
a=a&(x);
cout<<a<<"\n";
t--;
return 0;
【问题讨论】:
我建议在codereview.stackexchange.com 发布代码改进问题。 hackerrank.com/challenges/and-product/editorial 首先解决问题(在最坏的 O(log x) 时间内),“给定 x 设置了位 b,找到最小的 y>x 没有设置位 b。” 这意味着你的代码可以工作,但它的时间复杂度需要改进。 【参考方案1】:“……每个人类问题都有一个众所周知的解决方案——简洁、合理和错误。” - H.L. 门肯
在计算机科学中,我们可以改写:
“对于每个计算问题,都有一个简单、优雅且错误的解决方案。”
诸如hackerrank、求职面试、游戏中的演员寻路、在3d 中绘制一队宇宙飞船以及任何涉及筛选数据的生产系统中的问题,从来都不是关于是否有解决方案的问题。
真正的问题总是这样:
“找到一种方法来降低这个看似微不足道的任务的复杂性。”
从a
计数到b
同时将这些值组合在一起是线性时间算法 - O(b-a)。当 a 和 b 接近时,这很好。但是这个问题告诉你,他们最多可以有 2^32-1 的区间,也就是 40 亿次测试。
事实上,这个问题可以简化为 O(log2(b-a)),因为我们知道 b 大于 a。
查看以下二进制表示的最高位:
a 01001 (9)
b 11001 (25)
有一些常见的位,我们直观地认为这些位是答案中剩余 1 的候选者。
但是,b 有一个位是 1,其值比 a 的最高位大一个数量级。
为了从 a 计数到 b,低于最高位的每个位都必须存在于 1 和 0 的每个排列中 - 因为这就是二进制表示的工作方式。
如果我们通过每个排列对二进制位域进行置换,那么最终该域中的每个位都会在某个点包含一个 0。这意味着将位域的每个排列组合在一起的结果为零。
因此,当我们在 b 中找到不在 a 中的 1 位时,我们可以简单地从 a 中屏蔽掉所有较低幅度的位。
现在问题变成了:
找到b中不存在于a中的最高位,并屏蔽掉a中的所有低位。返回结果。
我们刚刚将搜索空间从 0
这是一个简单的解决方案——它甚至不需要优化位掩码的计算——它通过了所有关于hackerrank的测试。
#define TESTING 0
#include <iostream>
#include <string>
#if TESTING
#include <sstream>
#endif
#include <cstdint>
using namespace std::literals;
#if TESTING
const char test_data[] =
R"__(
3
12 15
2 3
8 13
)__";
#endif
bool has_bit(const std::uint32_t x, int bitnum)
return (x & (1 << bitnum)) != 0;
constexpr std::uint32_t mask_here_down(int bitnum)
std::uint32_t result = 0;
while (bitnum--)
result |= std::uint32_t(1) << bitnum;
return result;
void algo(std::istream& in, std::ostream& out)
std::uint32_t a,b;
in >> a >> b;
for (int bit = 32 ; bit-- ; )
if (has_bit(b, bit) and not has_bit(a, bit))
std::cout << (a & ~mask_here_down(bit)) << std::endl;
break;
void run_tests(std::istream& in, std::ostream& out)
int n;
in >> n;
while (n--)
algo(in, out);
int main()
#if TESTING
auto in = std::istringstream(test_data);
#else
auto& in = std::cin;
#endif
run_tests(in, std::cout);
【讨论】:
以上是关于在hackerrank中因超时而终止[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Java Security 类可防止您使用 exit(0) 终止代码!在 HackerRank
如何优化 Haskell 代码以通过 HackerRanks 超时测试用例(不是为了任何正在进行的比赛,只是我在练习)