计算Chef

时间:2016-09-21 06:24:40

标签: c++ arrays segmentation-fault gdb runtime-error

最近在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;
}

1 个答案:

答案 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;