1. 程式人生 > >SDUT 4349 補番計劃

SDUT 4349 補番計劃

補番計劃

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

    由於十月新番更新實在太慢,JH只好開始了自己的補番計劃。
JH將自己的想要補得番劇編號按照從小到大得順序排好記錄在便籤上(已知番劇編號最小是1,最大是1000)。
    現在你想要捉弄一下他,於是準備抹去其中連續的幾個編號,但你又不希望激怒JH,於是希望修改後的補番計劃能夠唯一的被還原。(詳情見下方提示)
    現在你想知道在滿足上述條件下最多能抹掉幾個編號。

Input

多組輸入,到檔案結束為止,
每組資料第一行輸入一個的整數 n 代表補番計劃裡的番劇數量( 1 <= n <= 100),
第二行由空格分隔 n 個正整數代表補番計劃中的編號  ai  ( 1 ≤ a1 < a2 < ⋯ < an ≤ 1000 ) 。

Output

輸出滿足題意的最長刪除長度。

Sample Input

6
1 3 4 5 6 9

Sample Output

2

Hint

對於樣例
可以刪除4,5 刪除後變成1 3 - - 6 9
3到6之間只有4,5兩個數,因此還原是唯一的。
對於資料
5
1 2 3 4 5
答案應該是4,因為可以刪除1, 2, 3, 4使得序列變成- - - - 5, 由於編號最小為1,所以還原的方式也是唯一的。

Source

行走的二叉樹

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    int a[111];
    while (cin >> n)
    {
        memset(a, 0, sizeof(a));
        for (int i = 0; i < n; i++)
            cin >> a[i];

        int ans = 0, cnt = 0;
        if (a[0] == 1 && a[1] == 2)
        {
            for (int i = 0; i < n; i++)
            {
                if (a[i] + 1 == a[i + 1])
                    cnt++;
                else
                    break;
            }
            ans = max(ans, cnt);
        }
        for (int i = 0; i < n - 1;)
        {
            int j, t = a[i];
            cnt = 0;
            for (j = i + 1; j < n; j++)
            {
                if (t + 1 == a[j])
                {
                    cnt++;
                    t = a[j];
                }
                else
                {
                    break;
                }
            }
            i = j;
            ans = max(ans, cnt - 1);
        }
        if (a[n - 1] == 1000 && a[n - 2] == 999)
        {
            cnt = 1;
            for (int i = n - 2; i >= 0; i--)
            {
                if (a[i] - 1 == a[i - 1])
                {
                    cnt++;
                }
                else
                    break;
            }
            ans = max(ans, cnt);
        }
        cout << ans << endl;
    }

    return 0;
}