程序超过了时间限制,这似乎是不可能的 - 错误的代码

时间:2012-04-02 21:04:53

标签: c++ performance debugging infinite-loop

这与数学有关,但是我在这里发布我的代码,因为似乎有一些错误让我不知所措。

问题

  

两个机器人 A & B 站在位于无限长直线上的位置0上。机器人 A 可以通过 a b 单位向左或向右移动,机器人 B 也可以执行相同,但由 c d 单位。他们要按下位于该直线上的按钮,距离0的距离不超过 k 。在多少个位置 p i 可以放置按钮,这样两个机器人都能够按下它(实际到达它),彼此独立。所以输入是1行中的5个正整数: a b c d ķ

     

约束: 0 a,b,c,d,k 10 18 和数量测试用例 t 其中 1 t 1000

     

时间限制: 1秒

     

例如:机器人 A a = 1, b = 2),机器人 B c = 4, d = 5),范围: k = 1

     

本案的答案是 3

我想一个解释会使这个问题不必要地长,并偏离主要关注点。我正在给出我想出的解决方案并继续我的代码。

我的解决方案:

m = LCM(HCF( a b ),HCF( c d ))

答案= 2 * [ k / m ] + 1

[]表示最大的整数函数(只是为了避免混淆)。

简短说明(对于那些对此问题感兴趣的人),我所做的就是检查 k 范围内存在多少 m 在任何一方,加上 0 位置。 HCF(a,b)将给出机器人可以采取的最短步骤,并且LCM中的HCF将给出他们可以站立的最小共同位置。然后找不到。倍数。

代码(C ++):

  1 #include <cstdio>
  3 using namespace std;
  4 typedef long long LL;
  5 
  6 inline void swap(LL *a, LL *b)
  7 {
  8     *a ^= *b;
  9     *b ^= *a;
 10     *a ^= *b;
 11 }
 12 
 13 long hcf(LL a, LL b)
 14 { return !a || !b ? a+b : hcf(b,a%b); }
 15 
 16 LL lcm(LL a, LL b)
 17 {
 18     if(a < b) swap(&a,&b);
 19     LL i=a;
 20     while(a%b) a+=i;
 21     return a;
 22 }
 23 
 24 int main()
 25 {
 26     int t; scanf("%d\n",&t);
 27     while(t--)
 28     {
 29         LL a,b,c,d,k;
 30         scanf("%lld %lld %lld %lld %lld",&a,&b,&c,&d,&k);
 31         printf("%lld\n", 1 + ((k / (lcm(hcf(a,b), hcf(c,d))) ) << 1) );
 32     }
 33     return 0;
 34 }

我只是实现了我的答案。我还通过1000个测试用例执行了我的程序,每个测试用例包括[10 16 ,10 18 ]范围内的随机+整数。我这样做了多次,最坏的时间消耗是 0.01 秒。

现在,当我将此代码提交到比赛页面时,我收到Time Limit Exceeded错误!这是不可能的,除非一些错误循环无休止地运行特定输入。我想我应该听取专家的意见,为什么我的代码会超时。请帮忙

P.S。:如果您对这个问题有更好的答案,欢迎您: - )

修改:PS:我对C++中处理大整数的方式持怀疑态度,因此我转换为python并提交了该文件,并再次提交Time Limit Exceeded错误。

2 个答案:

答案 0 :(得分:0)

您的代码中包含从scanf读取的stdin次来电。除非提供输入,否则它将无限期挂起。大多数竞赛都没有从stdin读取您的代码。规则说的是输入的来源?

答案 1 :(得分:0)

请注意,此代码非常危险:

inline void swap(LL *a, LL *b)
{
   /* sometimes also written as *a^=*b^=*a^=*b;  */
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

如果ab指向同一个内存,则会将该内存清零。

(尝试使用此交换来反转具有奇数个字母的字符串)

char* input = "abcde"
for(i=0, j=4; i<3; ++i, --j)
{
    swap(input+i, input+j);
}
// Result:  "ed0ba".
// With a normal-swap, 'c' would get swapped with 'c', returning "edcba"