程序超过了时间限制,这似乎是不可能的——错误代码
Program exceeds a time limit, which seems impossible - buggy code
这与数学有关,但我在这里发布了我的代码,因为似乎有一个错误一直困扰着我。
问题:
两个机器人A&B站在位于无限长直线上的位置
0
上。机器人A可以向左或向右移动A或b单位,机器人b也可以这样做,但可以移动c和d单元。他们要按下位于该直线上的按钮,距离0
不超过k个单位。在pi的多少个位置上,您可以放置按钮,以便两个机器人能够相互独立地按下按钮(实际到达)。因此,输入是1行中的5个正整数:a,b、c和d以及k。限制条件:0≤a、b、c、d、k≥1018和测试用例数t,其中1t≤<1000。
时间限制:1秒
例如:机器人A(A=1,b=2),机器人b
这种情况下的答案是3。
我想一个解释会使这个问题变得不必要地冗长,并偏离主要关注点。我给出了我想好的解决方案,然后继续我的代码。
我的解决方案:
设m=LCM(HCF(a,b
答案=2*[k/m]+1
[]表示最大的整数函数(只是为了避免混淆)。
简短地说(对于那些对这个问题感兴趣的人),我所做的只是检查在k的范围内,两边有多少m倍数,加上0位置。HCF(a,b)
会给出机器人能走的最短步数,两个HCF
的LCM
会给出它们能站的最小公共位置。然后找到倍数。
代码(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;
}
如果a
和b
指向同一个内存,这将清零该内存。
(尝试使用此交换反转具有奇数字母的字符串)
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"
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- fopen 与常量字符 * 从 QString 是不可能的
- C 程序如果功能中的语句不执行.在逻辑上似乎是错误的
- 可能是不可能的模板参数规范/推论
- 一个倒梯形,但如果输入高度对于宽度来说太大,那么它应该报告,不可能("不可能的形状"是什么)
- 这个逻辑似乎是正确的,但它不起作用.有没有错
- 为什么INVOKE总是取消引用数据成员,而不是在可能的情况下调用
- 捕获构造函数抛出的异常似乎是不可能的
- 为什么函数调用中的可变数组长度在C中是可能的,而在C++中是不可能的
- 为什么函数定义 foo(int i+=1) 是不可能的
- 推送和弹出操作的混合序列为什么这个序列是不可能的
- 为什么 const st::random_device 是不可能的
- 直接从C++调用 JNI c++ 方法是不可能的
- 程序超过了时间限制,这似乎是不可能的——错误代码
- 动态链接c++库中的虚函数是不可能的
- 当函数内联是不可能的
- 模板虚函数是不可能的.只是暂时的技术限制
- c++多态性:为什么即使类型很明显,静态绑定也是不可能的
- 为什么传递互斥锁到线程是不可能的
- c++/cli windows窗体在vs2012中,对象数组是不可能的