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; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。