题意:就是说给你一段区间,要你找出一段最长的区间,在这段区间的所有数都大于区间的第一个数、小于区间的最后一个数......输出区间的长度,若是长度为0则输出-1.
4
5 4 3 6
4
6 5 4 3
思路:暴力吧,有些技巧。可以说是区间合并,往后找一个数,然后往前找它前面有多少个数比它小,并记录最小值,和最小值的位置,然后用当前值所在位置减去最小值所在位置,就是这段区间的结果,再把这结果保存到当前值所在位置,然后往下找.....
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define M 50100
struct node
{
int num;
int sum;
}s[M];
int main()
{
int n;
while(scanf("%d",&n)>0)
{
//memset(s,0,sizeof(s));
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i].num);
s[i].sum=0;
}
int ans=0;
for(int i=2;i<=n;i++)
{
int j=i-1;
//int sum=0;
int minx=100000000;
int xxx=-1;
while(j>=1)
{
if(s[i].num>s[j].num)
{
if(s[j].sum==0)
{
//sum++;
if(s[j].num<minx)
{
minx=s[j].num;
xxx=j;
}
j--;
}
else
{
//sum+=s[j].sum;
j-=s[j].sum;
}
}
else
break;
}
if(xxx!=-1)
s[i].sum=i-xxx;
else
s[i].sum=0;
if(ans<s[i].sum)
ans=s[i].sum;
}
if(ans==0)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}