最近在codechef练习时遇到了this问题。
一切都很顺利,这是一个简单的问题,简单的逻辑,以及烹饪代码花了不到10分钟,它在我的机器上运行良好,但当我尝试执行它时给出Runtime Error(SIGSEGV)
在codechef中。
我认为我使用的数组可能有问题,没有帮助,我试图用gdb
调试它也很好,我甚至尝试了大约1000左右的大型测试用例,它运行良好,那为什么它在codechef中显示运行时错误?
以下是代码:
#include <iostream>
int main(){
int testCases;
std::cin >> testCases;
while(testCases--)
{
int jobs,n;
std::cin >> jobs >> n;
int doneJobs[n];
for(int i = 0; i < n; i++)
{
std::cin >> doneJobs[i];
}
bool todoJobs[jobs] = {false};
for(int i = 0; i < n; i++)
{
todoJobs[doneJobs[i] - 1] = true;
}
bool toSkip = false;
for(int i = 0; i < jobs; i++)
{
if(todoJobs[i] == false)
{
if(toSkip == false)
{
std::cout << i + 1 << ' ';
toSkip = true;
todoJobs[i] = true;
}
else
{
toSkip = false;
}
}
}
std::cout << std::endl;
for(int i = 0; i < jobs; i++)
{
if(todoJobs[i] == false)
{
std::cout << i+1 << ' ';
}
}
std::cout << std::endl;
}
return 0;
}
修改:
感谢@DominiqueLorre指出输入的一些随机值可能会产生Runtime Error
,但我在这里得到的是我编辑的代码:
#include <iostream>
int main(){
int testCases;
std::cin >> testCases;
while(testCases--){
int jobs,n;
std::cin>>jobs>>n;
bool todoJobs[jobs] = {false};
for(int i=0;i<n;i++){
int testJob;
std::cin >> testJob;
todoJobs[testJob-1] = true;
}
bool toSkip = false;
for(int i=0;i<jobs;i++){
if(todoJobs[i] == false){
if(toSkip == false){
std::cout << i+1 << ' ';
toSkip = true;
todoJobs[i] = true;
}else{
toSkip = false;
}
}
}
std::cout << std::endl;
for(int i=0;i<jobs;i++){
if(todoJobs[i] == false){
std::cout << i+1 << ' ';
}
}
std::cout << std::endl;
}
return 0;
}
答案 0 :(得分:3)
根据问题定义,它表示n,m satisfying 0 ≤ m ≤ n ≤ 1000
(在您的代码n => jobs, m => n
中),因此测试用例0 0
有效。但是,如果jobs
为0,则以下代码段将导致运行时错误,因为C ++ 14不允许声明零大小的动态数组。
bool todoJobs[jobs] = {false};
在数组分配之前添加语句以检查jobs
的值。
if (jobs <= 0) continue;