列表C ++

时间:2018-01-24 18:25:15

标签: c++ list

我需要帮助。我无法弄清楚为什么我的程序在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;
}

有谁知道为什么?

2 个答案:

答案 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'到达结尾并擦除值时,它指向(右)列表中未显示的部分,因此程序会出现意外行为。