Description
Input
Output
Sample Input
4 5 4 3 6 4 6 5 4 3
Sample Output
1 -1
题意:找到一个最长的区间,这个区间中间每个数字都要小于末尾的数,并且要大于区间开头的数,输出符合要求的最大区间长度
思路:先记录每一位数后面连续大于这个数的长度,然后再这个长度里找最大的数,这样可求得最大的区间
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int a[50005],dis[50005];//dis记录第i位后面连续有几个数大于第i位的数 int main() { int n,i,j,maxn,flag,ans; while(~scanf("%d",&n)) { ans = 0; for(i = 1; i<=n; i++) { scanf("%d",&a[i]); dis[i] = 1;//初始化为1 } dis[n+1] = -1; for(i = n; i>=0; i--)//找出所有符合要求的长度 { while(a[i]<a[i+dis[i]]) dis[i]+=dis[i+dis[i]]; } for(i = 1; i<=n; i+=flag+1)//下一个i从最大的那个数位置的下一个开始 { maxn = flag = -1; for(j = 0; j<dis[i]; j++)//在这个区间内找出最大的,得到一个长度 { if(a[i+j]>maxn) { maxn = a[i+j]; flag = j; } } if(flag>ans) ans = flag; } if(ans) printf("%d\n",ans); else printf("-1\n"); } return 0; }