原题链接:http://codeforces.com/problemset/problem/1145/A
题意:给出一组数字,求最长从小到大排列的数字序列,要求:若当前序列中存在a[i] > a[j] (i<j),则将整个数组前半部分去除或将后半部分去除,直到剩余数组中所有的数都是按照从小到大的顺序排列的,求这种情况下的最大剩余数字长度。
分析:因为每次需要判断当前数组段中是否存在a[i] > a[j] (i<j)的情况,而且给出的范围n是(1<=n<=16),因此递归判断每一次的数组段是否满足要求即可。
#include<bits/stdc++.h>
using namespace std;
int maxlen;///记录最大段长
void finds(int a[],int st, int ed)///数组a,当前数组段起点,终点
{
int fg = 0;
if(ed-st==0)///若ed==st 说明当前段长为1
{
if(maxlen==0)maxlen=1;///当所有满足条件段长均为1时,该判断其作用
return ;///出口1
}
for(int i = st;i<ed;i++)///判断
{
if(a[i]>a[i+1])
{
fg = 1;
break;
}
}
if(fg==0)
{
if(maxlen<ed-st+1)maxlen = ed-st+1;
return ;///当前段满足条件,出口2
}else
{
finds(a,st,(st+ed)/2);///递归求解
finds(a,(st+ed)/2+1,ed);
}
}
int main()
{
int n;
int a[20];
maxlen = 0;
cin>>n;
for(int i =0 ; i < n; i++)cin>>a[i];
finds(a,0,n-1);
cout<<maxlen<<endl;
return 0;
}