ideone超出时间限制但代码块超出时限

时间:2014-01-01 18:56:11

标签: c++ memory-management dictionary stl

我有这个与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 个答案:

答案 0 :(得分:0)

您的代码中存在一个微妙的错误。

如果在执行第while(it->second < temp1)行之前会发生什么,mymap大小为零,即它内部没有元素。你在哪里检查这种可能性?

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

在你的测试用例所呈现的场景中,最终不会有任何第一个元素,所以 it 最终将指向地图的末尾,不幸的是你没有检查 while 循环。

这就是你的代码以无限循环结束的地方。如果您将其更改为

while(it!=mymap.end() && it->second < temp1)
,它可能会为您提供正确的结果。