博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟祭-电灯-题解
阅读量:4961 次
发布时间:2019-06-12

本文共 1743 字,大约阅读时间需要 5 分钟。

我一个蒟蒻是真的太弱了

(我也很难受...可是...)

先%%%维护oj的大佬lsy

再%%%秒题的大佬lyn

 

我真的卑微至极了

------------------------------------------------------------

题目描述

有 n 个灯泡排成一列。每个灯泡可能是点亮或熄灭的。有一台操控灯泡的机器,每一次可以选择一段连续区间,让这段连续区间中熄灭的灯泡全部点亮,亮着的灯泡全部熄灭。但由于机器已经老化,仅能再使用一次了。

你可以认为点亮的灯泡与熄灭的灯泡交替排列的样子(下面称这样的灯泡列为交替列)很好看。现在,你希望珍惜最后一次操控灯泡的机会,使得操控后这列灯泡中最长的交替列尽可能地长。

例如,这列灯泡若原本如下所示(○ 表示点亮的灯泡,● 为熄灭的灯泡):

○ ○ ● ● ○ ● ○ ○ ○ ●

如果选择第 4 个到第 7 个灯泡,则会变成如下的形式:

○ ○ ● ○ ● ○ ● ○ ○ ●

此时,最长的交替列为第 2 个到第 8 个灯泡,长度为 7。

而如果仅选择第 8个灯泡,则会变成如下的形式: ○ ○ ● ● ○ ● ○ ● ○ ●

此时,最长的交替列为第 4 个到第 10 个灯泡,长度也为 7。

可以发现,此例中没有方法能使得最长交替列长度大于 7,则 7 即为答案。

输入格式

输入文件第一行一个正整数 n,表示灯泡的数量。 第二行包含 n 个数字,每个数字均为 0 或 1,依次代表序列中每个灯泡的初始状态。1 代表点亮,0 代表熄灭。

输出格式

输出一个整数,表示所有能得到的灯泡列中最长的交替列的长度。

样例

Input 1:

101 1 0 0 1 0 1 1 1 0

Output 1:

7

Input 2:

5 1 1 0 1 1

Output 2:

5
提示与说明

对于 30%的数据,1≤n≤500。

对于 60%的数据,1≤n≤2000。

对于 100%的数据,1≤n≤100000。

 

---------------------------------------------------------------

思路:

遇到相邻的灯泡状态相同的,就分块

那么

就可以把整体分成多个块(特殊情况:就一个块)

每个块中:是交替列

既然分块

那么每个块两边必然是和它不同的

那么

把它反转就可以和他两边的块组成大块

所以

我们只需要找到相邻3个块加起来的长度最大的值就可以了

 

 

 再用上前缀和维护就可以啦!!!

 

#include
using namespace std;int n;int a[100005];int cnt;int list[100005];int main(){ scanf("%d",&n); for(int i = 1;i <= n;i++) scanf("%d",&a[i]); int flg = 0; for(int i = 1;i <= n;i++) { if(flg>0) if(a[i] == a[i-1]) { list[++cnt] = flg; flg = 0; } flg++; } if(flg > 0) list[++cnt] = flg; int tot=0; int max = 0; for(int i = 1;i <= cnt;i++) { tot += list[i]; if(i >= 4) tot -= list[i - 3]; if(max < tot) max = tot; } printf("%d\n",max); return 0;}

 

 

转载于:https://www.cnblogs.com/darlingroot/p/10437929.html

你可能感兴趣的文章
计算机是如何启动的?
查看>>
JAVA内省机制
查看>>
iOS 5 Tutorials
查看>>
.NET Framework Security Overview
查看>>
Maven中的一些总结
查看>>
Excel函数大全
查看>>
javapms部署之后首页不能正常显示问题
查看>>
PAT 甲级 1094 The Largest Generation
查看>>
使用百度编辑器时,报错:从客户端("...)中检测到有潜在危险的 Request.Form 值...
查看>>
二阶环路滤波器的matlab 设计
查看>>
做GUI的随笔
查看>>
java内存分析样例1
查看>>
tensorflow deepmath:基于深度学习的自动化数学定理证明
查看>>
简明 Vim 练级攻略
查看>>
gluon 实现多层感知机MLP分类FashionMNIST
查看>>
当Y为某值时返回X的值
查看>>
Java 执行过程
查看>>
MVC入门教程二[第一个小Demo](转载)
查看>>
五角星
查看>>
MySQL常用数据库小结
查看>>