题面
东东去寿司店。他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃。
东东想吃鳗鱼,但是他的朋友想吃金枪鱼。和平起见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。
比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。
东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。
输入:
第一行:一个整数n(2≤n≤100000),寿司序列的长度。
第二行:n个整数(每个整数不是1就是2,意义如上所述)
输出:一个整数(代表东东可以选择的最长的一段连续的且合法的寿司的个数)
sample input:
7
2 2 2 1 1 2 2
samplt output:
4
sample input:
6
1 2 1 2 1 2
sample output:
2
sample input:
9
2 2 1 1 1 2 2 2 2
sample output:
6
思路:
- 最后选定的序列需要保证1和2的数量相同,同样的数字是连续出现的
- 利用 sum1,sum2 记录目前的选中区域中出现1 2 的数量
- 我们从头到尾开始遍历所有数字,如果和前一个数字相同那就sum++,如果和前一个数字不同则说明开始了一个新的序列,利用bool now记录当前位置的数字是什么。开始新的序列就更改now的状态,更新ans值和数字值
#include<stdio.h>
#include<iostream>
using namespace std;
const int N=1e6+1;
int a[N];
int main()
{
int n;
int ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
bool now;//如果是1就是1,如果是0就是2
int num1=0,num2=0;
if(a[0]==1)
{
num1++;
now=1;
}
if(a[0]==2)
{
num2++;
now=0;
}
for(int i=1;i<n;i++)
{
if(a[i]==1)
{
if(now) num1++;
if(!now)//遇到了2,更新ans的值
{
ans=max(ans,min(num1,num2)*2);
num1=1;
now=1;
}
}
else if(a[i]==2)
{
if(!now) num2++;
if(now)//遇到了1
{
ans=max(ans,min(num1,num2)*2);
num2=1;
now=0;
}
}
}
ans=max(ans,min(num1,num2)*2);
printf("%d\n",ans);
return 0;
}