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->second < temp1)
行之前,mymap 大小为零,即其中没有元素,会发生什么情况。你在哪里检查这种可能性?
请注意,考虑到您不断删除迭代器 it 指向的元素,然后将其设置为第一个元素,它可能会发生(并且它确实发生在您提供的测试用例中)的地图。
在您的测试用例提出的这种情况下,最终将不会留下任何第一个元素,因此 it 最终将指向地图的末尾,不幸的是您没有检查 while 循环。
这就是您的代码进入无限循环的地方。如果你把它改成
while(<b>it!=mymap.end()</b> && it->second < temp1)
,它可能会给你正确的结果。
【讨论】:
以上是关于ideone超过了时间限制,但代码块没有的主要内容,如果未能解决你的问题,请参考以下文章
fatal error C1061: 编译器限制 : 块嵌套太深
给定的两个代码之间有啥区别。一个在ideone上运行时超出时间限制,另一个工作正常[关闭]