做题感悟:这是比赛时没做出来的一题,想到暴力了,应该再深入一点,优化一下暴力。
解题思路:枚举起点与终点,找区间的最大值和最小值,只要最大值减最小值等于区间长度那么就是连号,至于最大值和最小值开始就记录一下,以后不断更新。
代码:
#include<stdio.h>
#include<iostream>
#include<map>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std ;
const int MX = 4005 ;
int g[MX] ;
char s[MX] ;
int main()
{
int mx,n ;
while(~scanf("%d",&n))
{
memset(g,0,sizeof(g)) ;
for(int i=0 ;i<n ;i++)
{
scanf("%s",s) ;
mx=0 ;
for(int j=2 ;j<10 ;j++)
mx=mx*10+s[j]-'0' ;
g[i]=mx ;
}
int best=1 ;
for(int i=0 ;i<n ;i++)
{
int max=g[i],min=g[i] ;
for(int j=i ;j<n ;j++)
{
max= g[j] > max ? g[j] : max ;
min= g[j] < min ? g[j] : min ;
if(max-min==j-i&&best<j-i+1)
best=j-i+1 ;
}
}
printf("%d\n",best*100) ;
}
return 0 ;
}