AcWing 3802. 消滅陣列
阿新 • • 發佈:2021-08-16
Description
給定一個長度為 \(n\) 的陣列,如果它不是非降序(非嚴格單調遞增)的,那麼就將它的前半部分或後半部分消滅。
不斷重複這個消滅一半陣列的過程,直至陣列變為升序為止。
請問,得以倖存的陣列的最大可能長度是多少?
Input
第一行包含整數 \(T\),表示共有 \(T\) 組測試資料。
每組資料第一行包含整數 \(n\)。
第二行包含 \(n\) 個整數 \(a_1, a_2, \cdots, a_n\),表示給定陣列。
Output
輸出倖存陣列的最大可能長度。
Solution
遞迴,定義work(int a[], int l, int r)
遞迴函式,從頭遍歷陣列,如果陣列\(a\)
mid = (l + r) / 2
, 返回max(work(a[], l, mid), work(a[], mid, r))
.
Code
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 20; int q[N]; int work(int a[], int l, int r) { if(l > r) return 0; int mid = (l + r) / 2; bool flag = true; for (int i = l; i < r - 1; i ++) { if (q[i] > q[i + 1]) { flag = false; break; } } if(flag) return r - l; return max(work(a, l, mid), work(a, mid, r)); } int main() { int T; cin >> T; while (T --) { int n; cin >> n; for (int i = 0; i < n; i ++) cin >> q[i]; int res = work(q, 0, n); cout << res << endl; } return 0; }