题目链接:D-东东买寿司
题目描述:
东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃
东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。
比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。
东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。
Input:
输入:
第一行:一个整数n(2≤n≤100000),寿司序列的长度。
第二行:n个整数(每个整数不是1就是2,意义如上所述)
Output:
输出:一个整数(代表东东可以选择的最长的一段连续的且合法的寿司)
Sample Input-1:
7
2 2 2 1 1 2 2
Sample Output-1:
4
Sample Input-2:
6
1 2 1 2 1 2
Sample Output-2:
2
Sample Input-3:
9
2 2 1 1 1 2 2 2 2
Sample Output-3:
6
思路:
用一个数字记录1和2出现的次数,然后设置变量记录当前元素的坐标,从前往后依次进行比较,
然后记录1和2出现次数最小的一个,保证有相同的1和2,然后最终输出乘2,即1和2同时算上。
总结:
统计序列中的元素的次数并选取最值,用一个数组记录元素次数就行了,然后进行比较。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m=1,len=0,cnt[maxn],a[maxn];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int pos=a[1];
while(m<=n){
while(a[m]==pos){
cnt[a[m]]++;
m++;
}
len=len>=min(cnt[1],cnt[2])?len:min(cnt[1],cnt[2]);
cnt[a[m]]=0;
pos=a[m];
}
cout<<len*2<<endl;
}