codeforces-1138A. Sushi for Two-题解之
题目:
A.两人份寿司
阿卡迪邀请安娜去一家寿司店吃饭。这家餐厅有点不寻常:它提供排列成行的nn寿司,顾客必须选择这些寿司的连续子片段来购买。
寿司有两种:金枪鱼寿司和鳗鱼寿司。让我们将左边寿司的ii-th类型表示为titi,其中ti=1表示金枪鱼,ti=2表示鳗鱼。
阿卡迪不喜欢金枪鱼,安娜不喜欢鳗鱼。阿卡迪想要选择这样一个连续的寿司子片段,它具有相同数量的每种类型的寿司,并且子片段的每一半只有一种类型的寿司。例如,subsegment[2,2,2,1,1,1]是有效的,但是subsegment[1,2,1,2,1,2]无效,因为两个半部分都包含两种寿司。
找出阿卡迪能买到的最长的连续细分寿司的长度。
输入
第一行包含单个整数n(2≤n≤100000)—寿司片数。
第二行包含nn整数t1, t2,…, tn (ti=1,表示金枪鱼寿司;ti=2,表示鳗鱼寿司),从左到右表示寿司的种类。
保证每种寿司至少有一块。注意,这意味着至少有一个有效的连续段。
输出
打印一个整数——有效连续段的最大长度。
例子
inputCopy
7
2 2 2 1 1 2 2
outputCopy
4
inputCopy
6
1 2 1 2 1 2
outputCopy
2
inputCopy
9
2 2 1 1 1 2 2 2 2
outputCopy
6
请注意
在第一个例子中,Arkady可以选择子段[2,2,1,1]或长度为44的子段[1,1,2,2]。
在第二个例子中,没有办法,只能选择长度为22的子段[2,1]或[1,2]中的一个。
在第三个例子中,Arkady的最佳选择是子段[1,1,1,2,2,2]
思路:
这道题用到fill(),新设立一个数组b,进行统计数据。
fill()函数参数:fill(first,last,val);
// first 为容器的首迭代器,last为容器的末迭代器,val为将要替换的值。
举例:
int a[200];
fill(a, a+100, 1);
就是把a的前100个元素的值赋为1
注意:
fill()中 ,它的原理是把那一块单元赋成指定的值,也就是说任何值都可以
memset(),则是将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,即0 、1
数组b[ j ]用来统计a中连续的个数,(一旦不连续,j++,用数组b的下一个序列来存)
我的code:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100005];
int b[100005];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
fill(b,b+n,1);//与mesert
int j=0;
//a[] 2 2 2 1 1 2 2
//b[] 1 1 1 1 1 1 1
for(int i=1;i<n;i++){
if(a[i]==a[i-1])
b[j]++;
else
j++;
}
int sum=0;
for(int i=1;i<=j;i++){
sum=max(sum,min(b[i],b[i-1]));
}
cout<<sum*2<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)