我有这个与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的最大值,我认为这会导致缓冲区溢出?
答案 0 :(得分:0)
您的代码中存在一个微妙的错误。
如果在执行第while(it->second < temp1)
行之前会发生什么,mymap大小为零,即它内部没有元素。你在哪里检查这种可能性?
请注意,它会发生(并且它会在您提供的测试用例中发生),考虑到您继续删除迭代器 it 指向的元素,然后将其设置为第一个元素的地图。
在你的测试用例所呈现的场景中,最终不会有任何第一个元素,所以 it 最终将指向地图的末尾,不幸的是你没有检查 while 循环。
这就是你的代码以无限循环结束的地方。如果您将其更改为
while(it!=mymap.end() && it->second < temp1)
,它可能会为您提供正确的结果。