SDUT 4349 補番計劃
阿新 • • 發佈:2018-12-29
補番計劃
Time Limit: 1000 ms Memory Limit: 65536 KiB
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; }