一、原题
题目描述
在远古时期,龙统治着大地,那时的气候非常暖和,气温从来没有低于0摄氏度。后来,龙灭绝了,温暖的气候也消失了。
现在的气候变得反复无常,已经没有了春夏秋冬轮流交替的规律了。冬天随时可能到来。我们规定如果某天的气温低于0度,就可以称它是冬天里一天。如果有连续T天,气温低于0度,则称这个冬天的周期是T。
人们总是谈论冬天就要来了,因为这容易引起不必要的恐慌。所以,政府规定,只能在一个周期为T的冬天到来之前的2T天之内谈论这个话题。有一个例外,最长的那个冬天,可以允许在它到来之前的3T天内谈论。可能有多个最长的冬天,那么只能选择其中的一个来实行3T的规则。现在,你知道未来每一天的气温,请找出最多有多少天,人们可以谈论冬天就要来了这个话题。
输入
第一行一个整数N(1<=N<=100000),表示总天数。
接下来一行包含N个整数,表示每天的气温,范围在[-100,100]内。
输出
一个整数,表示最大的天数。
样例输入
8
1 -1 4 3 8 -2 3 -3
样例输出
6
二、分析
这道题只是需要在一开始时记录一下最长的冬天,如果有多个,就记录下来,一个一个地尝试,就行了。具体的步骤见源代码的注释。
三、源代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,day[100005],win[100005],maxx,x,mx,s,sum;
bool vis[100005];
int main()
{
//freopen("winter.in","r",stdin);
//freopen("winter.out","w",stdout);//文件的读入输出
cin>>n;
for(int i=1;i<=n;i++)
cin>>day[i];
for(int i=n;i>=1;i--)
if(day[i]<0)
s++;//记录冬天的长度
else{//处理最大的天数
win[i+1]=s;//冬天断了
if(s>maxx)
maxx=s;//保存天数最大值
s*=2;
for(int j=i;j>=1&&s>0;j--,s--){
if(!vis[j]) sum++;
vis[j]=1;
}
s=0;
}
for(int i=n;i>=1;i--)
if(win[i]==maxx){
for(int j=i-2*win[i]-1;j>=1&&j>=i-3*win[i];j--)//尝试
if(!vis[j]) x++;
if(x>mx)//保存答案
mx=x;
x=0;
}
cout<<sum+mx;//输出答案
}
四、测试数据
给几组测试数据吧。
winter1.in
7
38 65 75 -29 34 11 34
winter1.out
3
winter2.in
13
1 -39 -86 83 55 65 -13 3 92 -90 23 66 84
winter2.out
5
winter3.in
8
1 -1 4 3 8 -2 3 -3
winter3.out
6