poj2452

题意:就是说给你一段区间,要你找出一段最长的区间,在这段区间的所有数都大于区间的第一个数、小于区间的最后一个数......输出区间的长度,若是长度为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;
}

 

posted @ 2013-10-08 19:50  紫忆  阅读(502)  评论(0编辑  收藏  举报