我需要帮助。我无法弄清楚为什么我的程序在main函数和任何其他函数中的工作方式不同,让我们说solve()函数。我想解决这个问题http://codeforces.com/contest/768/problem/B?locale=en。 我编写了代码并且工作正常,但在服务器中获得了时间限制。 我的代码是这样的,当我编译它时它工作正常:
#include<iostream>
#include<windows.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<list>
#include<iterator>
using namespace std;
main()
{
list < int > li;
list < int >::iterator i;
list < int >::iterator end = li.begin();
int n, l, r, buffer, ans = 0;
cin >> n >> l >> r;
li.push_back(n);
for(i=li.begin(); i!=li.end(); i++)
{
while(*i>1)
{
buffer = *i;
i = li.erase(i);
li.insert(i, buffer/2);
li.insert(i, buffer%2);
li.insert(i, buffer/2);
}
}
advance(end, r+1);
i = li.begin();
for(advance(i, l-1); i!=end; i++)
ans += *i;
cout << ans << endl;
return 0;
}
当我重写这样的代码时,它会停止正常工作,所以我认为时间限制是因为:
#include<iostream>
#include<windows.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<list>
#include<iterator>
using namespace std;
int solve()
{
list < int > li;
list < int >::iterator i;
list < int >::iterator end = li.begin();
int n, l, r, buffer, ans = 0;
cin >> n >> l >> r;
li.push_back(n);
for(i=li.begin(); i!=li.end(); i++)
{
while(*i>1)
{
buffer = *i;
i = li.erase(i);
li.insert(i, buffer/2);
li.insert(i, buffer%2);
li.insert(i, buffer/2);
}
}
advance(end, r+1);
i = li.begin();
for(advance(i, l-1); i!=end; i++)
ans += *i;
cout << ans << endl;
}
main()
{
ios_base::sync_with_stdio(false);
solve();
return 0;
}
有谁知道为什么?
答案 0 :(得分:0)
您的程序有不确定的行为。
你有:
list < int >::iterator end = li.begin();
在将任何内容添加到列表之前,与
相同list < int >::iterator end = li.end();
接着是
advance(end, r+1);
这是一个问题,因为您无法前进end
。
答案 1 :(得分:0)
我找到了答案。
while(*i>1)
{
buffer = *i;
i = li.erase(i);
li.insert(i, buffer/2);
li.insert(i, buffer%2);
li.insert(i, buffer/2);
}
在这部分代码中。当迭代器'i'到达结尾并擦除值时,它指向(右)列表中未显示的部分,因此程序会出现意外行为。