ideone超过了时间限制,但代码块没有

Posted

技术标签:

【中文标题】ideone超过了时间限制,但代码块没有【英文标题】:Time limit exceeded on ideone but not on code block 【发布时间】:2014-01-01 18:56:10 【问题描述】:

我有这段代码与 SPOJ 的 BUSYMAN 问题有关。

#include<stdio.h>
#include<map>

int main()

    int cases, i, j, act, answer, temp1, temp2;
    scanf("%d",&cases);

    for(i=0; i<cases; i++)
    
        answer = 0;
        scanf("%d", &act);
        std::multimap<int, int> mymap;

        for(j=0; j<act; j++)
        
            scanf("%d",&temp1);
            scanf("%d",&temp2);
            mymap.insert(std::pair<int,int>(temp2, temp1));;
        

        std::multimap<int,int>::iterator it;
        temp1 = (mymap.begin())->second;

        while(mymap.size() != 0)
        
            it = mymap.begin();
            if(it->second < temp1)
            
                mymap.erase(it);
                continue;
            

            answer++;
            temp1 = it->first;
            mymap.erase(mymap.begin());

            if(mymap.size() != 0)
            
                it = mymap.begin();
                while(it->second < temp1)
                
                    mymap.erase(it);
                    it = mymap.begin();
                
            
        

        printf("%d\n",answer);
    

    return 0;

此代码在代码块上运行,并为测试用例给出正确答案 = 3:

1
6
7 9 0 10 4 5 8 9 4 10 5 7

但是对于同一个测试用例,我在 ideone.com 甚至在 spoj 上都超出了时间限制。

对于 SPOJ 上给出的其余测试用例,它在 ideone 和代码块上运行良好。 它是无限循环还是有其他问题? 我们如何为 multimap 分配内存,因为在这个问题中 act 的最大值可以为 100000,我认为这会导致缓冲区溢出?

【问题讨论】:

【参考方案1】:

您的代码中有一个细微的错误。

如果在执行while(it-&gt;second &lt; temp1) 行之前,mymap 大小为零,即其中没有元素,会发生什么情况。你在哪里检查这种可能性?

请注意,考虑到您不断删除迭代器 it 指向的元素,然后将其设置为第一个元素,它可能会发生(并且它确实发生在您提供的测试用例中)的地图。

在您的测试用例提出的这种情况下,最终将不会留下任何第一个元素,因此 it 最终将指向地图的末尾,不幸的是您没有检查 while 循环。

这就是您的代码进入无限循环的地方。如果你把它改成

while(<b>it!=mymap.end()</b> &amp;&amp; it-&gt;second &lt; temp1)
,它可能会给你正确的结果。

【讨论】:

以上是关于ideone超过了时间限制,但代码块没有的主要内容,如果未能解决你的问题,请参考以下文章

相同输入的 ideone 和代码块中的不同输出(小阶乘)

在 Kattis 上识别地图图块超过了时间限制

fatal error C1061: 编译器限制 : 块嵌套太深

给定的两个代码之间有啥区别。一个在ideone上运行时超出时间限制,另一个工作正常[关闭]

我做的FPGA课题要用到大量的数据,我用的xilinx的板子,大概会用到100块ram,但每块ram深度不深。

每个 SM 的最大驻留块数?