我在Codechef遇到了问题here。我正在尝试使用矢量进行记忆。由于我还是编程新手并且对STL容器不熟悉,我使用vector
作为查找表。 (尽管我曾建议使用map
帮助解决问题)。
所以,我的问题是下面给出的解决方案如何运行到运行时错误。为了得到错误,我使用问题的边界值(100000000
)作为输入。我的Netbeans IDE显示的错误消息为RUN FAILED (exit value 1, total time: 4s)
,输入为1000000000
。这是代码:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
#define LCM 12
#define MAXSIZE 100000000
using namespace std;
/*
*
*/
vector<unsigned long> lookup(MAXSIZE,0);
int solve(int n)
{
if ( n < 12) {
return n;
}
else {
if (n < MAXSIZE) {
if (lookup[n] != 0) {
return lookup[n];
}
}
int temp = solve(n/2)+solve(n/3)+solve(n/4);
if (temp >= lookup[n] ) {
lookup[n] = temp;
}
return lookup[n];
}
}
int main(int argc, char** argv) {
int t;
cin>>t;
int n;
n = solve(t);
if ( t >= n) {
cout<<t<<endl;
}
else {
cout<<n<<endl;
}
return 0;
}
答案 0 :(得分:3)
我怀疑这是否是一个内存问题,因为他已经说过该程序实际运行并输入了100000000。
我注意到的一件事情,即使n == MAXSIZE(在这种情况下),在if条件下你正在进行查找[n]。由于C ++使用0索引向量,因此这将超出向量的末尾。
if (n < MAXSIZE) {
...
}
...
if (temp >= lookup[n] ) {
lookup[n] = temp;
}
return lookup[n];
我无法猜测算法在做什么,但我认为第一个“if”的右括号应该更低,你可以在这个边界条件下返回错误。
答案 1 :(得分:2)
您要么没有足够的内存,要么没有足够的连续地址空间来存储100,000,000 unsigned long
秒。
答案 2 :(得分:0)
这主要是内存问题。对于向量,您需要连续的内存分配[以便它能够跟上其对常量时间查找的承诺]。在你的情况下,使用8字节双,你基本上要求你的机器在一个块中为你提供大约762 MB的内存。
我不知道你正在解决哪个问题,但看起来你正在解决Bytelandian硬币问题。为此,使用地图要好得多,因为:
因此,在您的情况下使用的最好的事情是std :: map。在您的情况下,实际上只需将std::vector<unsigned long>
替换为std::map<int, unsigned long>
,map
也可以[]
操作员访问[大部分,它应该]。