トピック: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 + = 3。M / = 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 。
}