我对c++编程和StackOverflow很陌生,但我对核心Java有一些经验。我想参加奥林巴斯的编程,我选择了c++,因为c++代码通常比等价的c++代码更快。
我正在解决一些在分区级别涉及递归和DP的问题,我遇到了一个名为序列博弈的问题。
但不幸的是,我的代码似乎不起作用。它的出口代码是3221225477,但我无法从中得到任何东西。我记得Java在指出我的错误方面做得更好,但是在c++中,我对正在发生的事情一无所知。这是密码,
#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
int N, minimum, maximum;
set <unsigned int> result;
vector <unsigned int> integers;
bool status = true;
void score(unsigned int b, unsigned int step)
{
if(step < N)
{
unsigned int subtracted;
unsigned int added = b + integers[step];
bool add_gate = (added <= maximum);
bool subtract_gate = (b <= integers[step]);
if (subtract_gate)
subtracted = b - integers[step];
subtract_gate = subtract_gate && (subtracted >= minimum);
if(add_gate && subtract_gate)
{
result.insert(added);
result.insert(subtracted);
score(added, step++);
score(subtracted, step++);
}
else if(!(add_gate) && !(subtract_gate))
{
status = false;
return;
}
else if(add_gate)
{
result.insert(added);
score(added, step++);
}
else if(subtract_gate)
{
result.insert(subtracted);
score(subtracted, step++);
}
}
else return;
}
int main()
{
ios_base::sync_with_stdio(false);
ifstream input("input.txt"); // attach to input file
streambuf *cinbuf = cin.rdbuf(); // save old cin buffer
cin.rdbuf(input.rdbuf()); // redirect cin to input.txt
ofstream output("output.txt"); // attach to output file
streambuf *coutbuf = cout.rdbuf(); // save old cout buffer
cout.rdbuf(output.rdbuf()); // redirect cout to output.txt
unsigned int b;
cin>>N>>b>>minimum>>maximum;
for(unsigned int i = 0; i < N; ++i)
cin>>integers[i];
score(b, 0);
set<unsigned int>::iterator iter = result.begin();
if(status)
cout<<*iter<<endl;
else
cout<<-1<<endl;
cin.rdbuf(cinbuf);
cout.rdbuf(coutbuf);
return 0;
}(注:我故意不使用ty胡枝子)。
我在一台windows机器中编译了这段代码,它的输出如下:
在19.8秒完成,出口代码3221225477 .
虽然我有一个英特尔i5-8600,它花了这么多的时间来编译,大部分时间是由防病毒扫描我的exe文件,甚至有时它继续编译很长时间,没有任何干预的反病毒。
(注意:我没有使用命令行,而是使用了崇高的文本来编译它)。我甚至尝试了tdm-gcc,然后又出现了一些特殊的出口代码。我甚至试图在Ubuntu机器上运行它,但不幸的是它找不到输出文件。当我在一个Codechef在线IDE上运行它时,尽管它没有正常运行,但是错误消息没有明明子的那么可怕,它说有一个运行时错误,并且"SIGSEGV“显示为一个错误代码。Codechef说
SIGSEGV是由无效的内存引用或分段错误引起的错误(信号)。您可能试图访问超出界限的数组元素,或者试图使用过多的内存。造成分段错误的其他原因包括:使用未初始化的指针、取消对空指针的引用、访问程序不拥有的内存。
几天过去了,我一直在努力解决这个问题,现在我真的很沮丧。首先,当我开始解决这个问题时,我使用了c数组,然后改为向量,最后改为std::set,同时跳到它会解决问题,但是没有什么效果。我尝试了另一个dp问题,结果又是这样。
如果有人能帮我找出我的代码有什么问题,那就太好了。提前谢谢。
发布于 2018-11-19 06:44:27
转换为十六进制的3221225477是0xC0000005,它代表违犯,这意味着您试图访问(读、写或执行)无效内存。
我记得Java在指出我的错误方面做得更好,但是在c++中,我对正在发生的事情一无所知。
当您遇到程序崩溃时,应该在调试器下运行它。由于您在Windows上运行代码,我强烈推荐VisualStudio2017 Community。如果您在它下面运行代码,它将指出崩溃发生的确切位置。
至于崩溃本身,正如PaulMcKenzie在注释中指出的那样,您正在索引一个空向量,这会使std::cin写入超出边界的内存。
发布于 2018-11-19 07:23:15
P.W的答案是正确的,但使用push_back的另一种选择是在N已知后预先分配向量。然后,您可以像以前一样从cin直接读取向量元素。
integers = vector<unsigned int>(N);
for (unsigned int i = 0; i < N; i++)
cin >> integers[i];该方法的另一个优点是只为向量分配一次内存。如果基础缓冲区被填满,push_back方法将重新分配。
https://stackoverflow.com/questions/53369440
复制相似问题