首先我要说的是,C ++不是我的基本语言,如果它是基础知识,我会请求宽恕。
我的问题是我必须用我的算法克服时间限制。我确信算法本身是好的(我不想要它的帮助;)),但传递给它的数据是从控制台给出的。
我需要在由EOF符号终止的单行中读取随机数的整数(限制为10 ^ 7)。到目前为止,我得到了类似的东西:
cin.tie(NULL);
std::ios::sync_with_stdio(false);
vector <unsigned int > vector_of_int;
...
std::string str;
std::getline(std::cin, str);
std::istringstream sstr(str);
unsigned int n;
while(sstr >> n){
vector_of_int.push_back(n);
}
但是 - 这还不足以适应此任务的时间限制。所以问题是 - 有没有更快(欺骗友好)的方式来阅读这种数据?
我的结果是
number status signal time memory
test 0 passed OK 0.0s 2828KB
test 1 passed OK 0.0s 2828KB
test 2 passed OK 0.01s 2828KB
test 3 passed OK 0.0s 2828KB
test 4 passed OK 0.01s 2828KB
test 5 passed OK 0.0s 2828KB
test 6 passed OK 0.0s 2940KB
test 7 passed OK 0.04s 3060KB
test 8 passed OK 0.24s 3452KB
test 9 passed OK 0.44s 3452KB
test 10 passed OK 0.84s 3452KB
test 11 TLE OK 1.01s 27784KB
test 12 TLE OK 1.01s 28056KB
编辑:
评论vector_of_int.push_back(n);
行
number status signal time memory
test 0 passed OK 0.0s 2828KB
test 1 wrong answer OK 0.0s 2828KB
test 2 wrong answer OK 0.0s 2828KB
test 3 wrong answer OK 0.0s 2828KB
test 4 wrong answer OK 0.0s 2828KB
test 5 wrong answer OK 0.0s 2828KB
test 6 wrong answer OK 0.01s 2964KB
test 7 runtime error SIGSEGV 0.02s 3128KB
test 8 runtime error SIGSEGV 0.06s 5504KB
test 9 runtime error SIGSEGV 0.09s 8032KB
test 10 runtime error SIGSEGV 0.16s 13224KB
test 11 runtime error SIGSEGV 0.21s 14976KB
test 12 runtime error SIGSEGV 0.28s 23440KB
编辑2:
我注意到输入行是由EOF而不是新行终止的。
答案 0 :(得分:1)
鉴于结果数据,我相信你可以通过加入
来达到目标 vector_of_int.reserve(1e7);
在致电任何 push_back
。
此行告诉vector
保留用于接收至少1e7
个元素的内存。这将阻止任何似乎正在发生的内存重新分配。 1e7
在您的问题中明确记录为上限。
答案 1 :(得分:0)
我找到了解决方案!
vector <int> vector_of_int;
vector_of_int.reserve(1e7);
char ch;
int i = 0;
int acc = 0, buf;
while( (ch=getchar()) > 0 ){
if(ch!=' ') {
acc = acc * 10 + ch - '0';
} else {
vector_of_int.push_back(acc);
acc = 0;
}
}
它给了我下面列出的结果
number status signal time memory
test 0 passed OK 0.0s 2688KB
test 1 passed OK 0.01s 2688KB
test 2 passed OK 0.01s 2688KB
test 3 passed OK 0.01s 2688KB
test 4 passed OK 0.01s 2688KB
test 5 passed OK 0.01s 2688KB
test 6 passed OK 0.01s 2688KB
test 7 passed OK 0.01s 2688KB
test 8 passed OK 0.12s 2688KB
test 9 passed OK 0.23s 2688KB
test 10 passed OK 0.46s 2688KB
test 11 passed OK 0.63s 2688KB
test 12 passed OK 0.86s 2688KB
我没有更改算法中的单行,所以这就成了伎俩。