問題概要
のグリッド状の盤面でゲームを行う. の各 について,セル からは 個右のセルにのみ移動することができる.
セル からスタートして,セル に到達することは可能か?
解法
題意より,各セルから移動できる場所は一意に定まります.従って,セル に辿り着くか,右端に到達するまで移動を繰り返すことで,,セル に到達できるか否かを判定することができます.
実装に於いては,セル からの移動は という更新でシミュレートできます.
コード
using VI = vector< int >; template < typename T > inline istream& operator>>( istream &s, vector< T > &v ){ for ( T &t : v ) { s >> t; } return s; } int main() { cin.tie( 0 ); ios::sync_with_stdio( false ); int N, T; cin >> N >> T; --T; VI A( N - 1 ); cin >> A; int p = 0; while ( p < N - 1 && p < T ) { p = p + A[p]; } cout << ( p == T ? "YES" : "NO" ) << endl; return 0; }