https://codeforces.com/problemset/problem/1138/A
题意:
一排寿司,有金枪鱼和鳗鱼两种,找到最大的连续序列,一半全是金枪鱼,另一半全是鳗鱼。
思路:
遍历一遍,整合成一个序列,代表每种寿司连续出现多少次;
然后找到相邻对中,较小数最大的那对。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
class status
{
public:
int cnt;
int _type;
public:
void print_self(int i)
{
printf("[%d]: type = [%d], cnt = [%d]\n",i, _type, cnt);
}
};
unsigned int sushi[100010];
int main()
{
int cnt = 0;
while(scanf("%d",&cnt)!=EOF)
{
// input
int ipt;
memset(sushi,0,sizeof(sushi));
for(int i=0; i<cnt; i++)
scanf("%d",&sushi[i]);
// calculate
auto kind = sushi[0];
int tmp_cnt = 1;
vector<status> vec;
for(int i=1; i<cnt;)
{
if(sushi[i] == kind)
{
tmp_cnt++;
i++;
}
else
{
status p;
p.cnt = tmp_cnt;
p._type = kind;
vec.push_back(p);
tmp_cnt = 1;
kind = sushi[i];
i++;
}
}
status p;
p.cnt = tmp_cnt;
p._type = kind;
vec.push_back(p);
int max_cnt = 0;
auto vec_size = vec.size();
if(vec_size == 1)
{
max_cnt = 0;
}
else if (vec_size == 2)
{
max_cnt = 2 * min(vec[0].cnt, vec[1].cnt);
}
else
{
for(int i=0; i<vec_size; i++)
{
if(vec[i]._type != 1)
continue;
tmp_cnt = 0;
if(i == 0)
{
tmp_cnt = 2 * min(vec[i].cnt, vec[i+1].cnt);
}
else if (i == vec_size-1)
{
tmp_cnt = 2 * min(vec[i].cnt, vec[i-1].cnt);
}
else
{
tmp_cnt = max(vec[i-1].cnt, vec[i+1].cnt);
tmp_cnt = 2 * min(vec[i].cnt, tmp_cnt);
}
max_cnt = max(tmp_cnt, max_cnt);
}
}
// output
printf("%d\n", max_cnt);
}
return 0;
}