给定一个长度为 n
的数组,如果它不是非降序(非严格单调递增)的,那么就将它的前半部分或后半部分消灭。
不断重复这个消灭一半数组的过程,直至数组变为升序为止。
请问,得以幸存的数组的最大可能长度是多少?
输入格式
第一行包含整数 T
,表示共有 T
组测试数据。
每组数据第一行包含整数 n
。
第二行包含 n
个整数 a1,a2,…,an
,表示给定数组。
输出格式
输出幸存数组的最大可能长度。
数据范围
1≤T≤10,1≤n≤16,n保证是 2的整数次幂。
1≤ai≤100
输入样例:
3
4
1 2 2 4
8
11 12 1 2 13 14 3 4
4
7 6 5 4
输出样例:
4
2
1
非常简单的dfs + 二分
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int a[N];
int n,t;
int ans,res;
int dfs(int l,int r)
{
bool flag = true;
for(int i = l;i < r;i++)
if(a[i] > a[i+1])
flag = false;
if(flag) return r - l + 1;
int mid = l+ r >> 1;
return max(dfs(l,mid),dfs(mid+1,r));
}
int main()
{
cin >> t;
while(t--)
{
cin >> n;
for(int i = 0;i < n;i++) cin >> a[i];
cout << dfs(0,n-1) << endl;
}
return 0;
}