【Luogu P1588]は牛を失っ

この質問は、出発点からして、座標X2または別の+1や-1の後に抽象化についてです。これは明らかに探索問題である、と明らかにそれは2点の座標との差にまでステップ数いることがわかります。しかし、10のデータ範囲5、直接的エクスポージャー確かMLE検索やTLE、確かではないが、最適化を追加してください。

私たちは、0,10(座標の範囲があることに注意してください5、明らかに解決するので、直接剪定なかっただろう、この範囲外の地点まで延長ます。私たちは、BFSの検索を使用するように、明らかに検索するための最初の時間のために、]そのポイントは、この時点までのステップの最小数である必要があり、再度このポイントに到達し、その後、いくつかのメモリを考えて、それを再度検索する必要はありません。

だから、最後の食事の剪定作業がシミュレートされた条件が少ない原因MLEqwqを剪定する場合ので、問題を提示することができます。

書式#include <cstdioを> 
する#include <cstdlib> 
書式#include <アルゴリズム> 
書式#include <CStringの> 
の#include <キュー>
 使用して 名前空間はstdを、
int型の D [ 100010 ]。
ブールチェック(int型x)は
{ 
    返すのx> 0 && X < 100000 &&!D [X]。
} 
INT S、T。
構造体qwq 
{ 
    int型のx、ステップと 
}上; 
ボイドBFS()
{ 
    キュー <qwq> Q。
    q.push((qwq){S、1}); 
    D [S] = 1 一方、(q.size())
    { 
        トップ = q.front()。
        q.pop(); 
        もし(top.x == t)が復帰もし(チェック(top.x + 1 ))
        { 
            q.push((qwq){top.x + 1、top.step + 1 })。
            D [top.x + 1 ] = top.step + 1 
        } 
        であれば(チェック(top.x - 1 ))
        { 
            q.push((qwq){top.x -1、top.step + 1 })。
            D [top.x - 1 ] = top.step + 1 
        } 
        であれば(チェック(top.x << 1 ))
        { 
            q.push((qwq){top.x << 1、top.step + 1 })。
            D [top.x << 1 ] = top.step + 1 
        } 
    } 
} 
int型のmain()
{ 
    int型TT。
    scanf関数(" %のD "、およびTT);
    一方、(tt-- 
    { 
        scanf関数(" %D%D "、&​​S&T)。
        memsetの(D、0はsizeof (d)参照)。
        BFS(); 
        printf(" %d個の\ n "、D [T] - 1 )。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/lijilai-oi/p/10987874.html