冬天

32 篇文章 1 订阅
9 篇文章 0 订阅

一、原题

题目描述

在远古时期,龙统治着大地,那时的气候非常暖和,气温从来没有低于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值