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

Program exceeds a time limit, which seems impossible - buggy code

本文关键字:似乎是 不可能 错误代码 过了 时间 程序      更新时间:2023-10-16

这与数学有关,但我在这里发布了我的代码,因为似乎有一个错误一直困扰着我。

问题

两个机器人A&B站在位于无限长直线上的位置0上。机器人A可以向左或向右移动Ab单位,机器人b也可以这样做,但可以移动cd单元。他们要按下位于该直线上的按钮,距离0不超过k个单位。在pi的多少个位置上,您可以放置按钮,以便两个机器人能够相互独立地按下按钮(实际到达)。因此,输入是1行中的5个正整数:abcd以及k

限制条件:0a、b、c、d、k1018和测试用例数t,其中1t≤<1000

时间限制:1秒

例如:机器人AA=1,b=2),机器人b

这种情况下的答案是3

我想一个解释会使这个问题变得不必要地冗长,并偏离主要关注点。我给出了我想好的解决方案,然后继续我的代码。

我的解决方案:

m=LCM(HCF(ab

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

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

简短地说(对于那些对这个问题感兴趣的人),我所做的只是检查在k的范围内,两边有多少m倍数,加上0位置。HCF(a,b)会给出机器人能走的最短步数,两个HCFLCM会给出它们能站的最小公共位置。然后找到倍数。

代码(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("%dn",&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("%lldn", 1 + ((k / (lcm(hcf(a,b), hcf(c,d))) ) << 1) );
 32     }
 33     return 0;
 34 }

我只是简单地实现了我的答案。我还通过1000个测试用例执行了我的程序,每个测试用例都由[1016,1018]范围内的随机+整数组成。我做了多次,最坏的情况是时间消耗0.01秒。

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

附言:如果你对这个问题有更好的答案,欢迎:-)

编辑:p.S.:我对C++中处理大整数的方式持怀疑态度,所以我转换为python并提交了它,这再次产生了Time Limit Exceeded错误。

您的代码中充满了从stdin读取的scanf调用。除非提供输入,否则它将无限期挂起。大多数比赛都不会从stdin读取您的代码。规则规定输入的来源是什么?

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

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"