作者 : Xia Xinyu
日期 : 2021-08-13
原题链接
题目 :给定一个长度为 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
思路:若当前数组是不是非降序的,我们就分别处理这个数组的前半部分和后半部分,所以这个问题可以分解为不同子问题,所以使用递归来处理,递归部分代码使用常用二分模版。
二分算法模版点这里
import java.util.*;
public class Main{
public static int is_incre(int[] a,int l,int r){
int mid = (l + r) / 2;
boolean flag = true;
for(int i = l + 1;i <= r;i++){
if(a[i - 1] > a[i]) flag = false;
}
if(flag) return r - l + 1;
else return Math.max(is_incre(a,mid + 1,r),is_incre(a,l,mid));
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while(T-- != 0){
int n = in.nextInt();
var a = new int[n];
for(int i = 0;i < n;i++) a[i] = in.nextInt();
int ans = 0;
int l = 0,r = n - 1;
System.out.println(is_incre(a,l,r));
}
}
}