HihoCoder1873(バイナリ分割)

トピック:http://hihocoder.com/problemset/problem/1873

解決策:分割統治を使用してのアイデアは、徐々に小さな問題に大きな問題を打破します。

  

まず第一に、私たちはカテゴリーを議論することができるようにプログラムのm種類は、フィニッシュラインに到達する必要があり、問題は、私の現在の地位posのポイントとして理解することができます。

       <1> mが偶数である:プログラム番号= M / 2

                 POS + 3への転送ゲートの位置に基づいて、POS + 1;二種類の数にスキーム3つのPOSのPOS +から、2の代わりに、+ 1ポータルPOS + POSを構築します。

                 問題は、に分かれています。私は今、必要なメートルは、端末に到達するためのプログラムの\ 2種類+ 3ポイントをPOSに立っています。
      <2> mの奇数次のとおりです。

                       mが偶数であるましょう、トランスファゲート199は、POS + 1の点を配置​​します。

                        その後、点上のPOS + 2をジャンプ、問題になる:POSにおける2点+、プログラムのM-1種類の最後に到達する必要があります。

コード:

書式#include <iostreamの> 
の#include <CStringの>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
const  int型 MAXN = 205 ;
INT メイン()
{ 
    LLのM; 
    一方、(CIN >> M){
         int型の POS = 0、CNT = 0 、[MAXN]。
        memsetの( - 1はsizeof (a)参照)。
        もし(m個の== 0 ){ 
            COUT << " 2 " << ENDL。 
            COUT<< " 1 1 " << てendl; 
            裁判所未満 << " 2 1 " << てendl;
            続け; 
        } 
        一方、(M!= 0 ){
             場合(M == 1 ){ 
                [POS + 1 ] = 199 
                [POS + 2 ] = POS + 2 
                CNT + = 2 ;  
                破ります; 
            } {
                もし(M%2 == 0 ){ 
                    [POS + 1 ] = POS + 3 
                    [POS + 2 ] = POS + 1 
                    POS + = 3M / = 2 
                    CNT + = 2 ; 
                } { 
                    [POS + 1 ] = 199 
                    POS + = 2 ; M--  ;  
                    CNT ++ ; 
                } 
            } 
            
            
        } 
        COUT << CNT << ENDL。
        以下のためにint型 iは= 0 ; iは< 199 ; iは++ ){
             場合([I] == - 1続けます
            coutの << I << "  " << [I] << てendl; 
        } 
    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/Lemon1234/p/11655561.html