冬天

来源:互联网 发布:手机淘宝店铺红包链接 编辑:程序博客网 时间:2024/04/16 20:52

一、原题

题目描述

在远古时期,龙统治着大地,那时的气候非常暖和,气温从来没有低于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

0 0
原创粉丝点击