解法
まず、各数字が存在するか否かを配列にします。
その配列から、存在しない数の個数が許容される範囲(空白カードがあれば 1 以下、無ければは 0 以下)に収まる区間をしゃくとり法で求め、最長のものを答えとします。
コード
typedef vector<int> VI; #define REP( i, m, n ) for ( int i = (int)( m ); i < (int)( n ); ++i ) int solve( VI cards ) { const int N = cards.size(); int cap = cards[0]; int s = 1, t = 1, numSpace = cards[1] == 0, res = 0; while ( s < N ) { while ( t + 1 < N && numSpace <= cap ) { numSpace += cards[ ++t ] == 0; } res = max( res, t - s ); numSpace -= cards[ s++ ] == 0; } return res; } int main() { cin.tie( 0 ); ios::sync_with_stdio( false ); while ( true ) { int n, k; cin >> n >> k; if ( !( n | k ) ) { break; } VI cards( 100001 ); REP( i, 0, k ) { int tmp; cin >> tmp; cards[ tmp ] = 1; } cout << solve( cards ) << endl; } return 0; }