AcWing一排奶牛

农夫约翰的 N 头奶牛排成一排。

每头奶牛都用一个整数品种 ID 标识,队列中第 i 头奶牛的 ID 为 Bi。

约翰认为如果有一大段连续的奶牛都具有相同的品种 ID,他的奶牛就会更加的引人注目。

为了创造这样的连续段,约翰决定选取一个特定品种 ID,并从队列中剔除所有具有此 ID 的奶牛。

请帮助约翰确定,他通过这样做,能够获得的具有相同品种 ID 的最大奶牛连续段的长度。

输入格式

第一行包含整数 N。

接下来 N 行,每行包含一个 Bi。

输出格式

输出具有相同品种 ID 的最大奶牛连续段的长度。

数据范围

扫描二维码关注公众号,回复: 14225911 查看本文章

1≤N≤1000,
0≤Bi≤10^6,
不含所有奶牛品种都相同的数据。

输入样例:

9
2
7
3
7
7
3
7
5
7

输出样例:

4

样例解释

最初队列中奶牛的品种 ID 依次为 2,7,3,7,7,3,7,5,7。

我们去掉所有品种 ID 为 3 的奶牛,剩下的奶牛的品种 ID 依次为 2,7,7,7,7,5,7。

最大的具有相同品种 ID 的奶牛连续段的长度为 4。

源代码

观察这道题目我们可以发现,此处的双指针算法与查单词所用的双指针算法不太一样,首先我们开辟的动态数组将目标元素无差别的存储,在存储过后能够将相同元素去重,拿样例来说也就是2,7,3,7,7,3,7,5,7处理之后动态数组当中仅为2,3,5,7,而后依次将这四个元素作为待筛选元素来枚举,对于数组进行遍历的过程之中,尾指针最终停留的位置是与头指针元素不同的元素位置,也就是与头指针元素相同元素的下一个位置,因此长度的话仅仅为j-i即可,且当尾指针指向与筛选元素相同的元素时是要后移且不计数的,那么我们就利用偏移量来计算,若出现一次则偏移量-1,即最终答案为j-i+d,在进行一个筛选元素的处理之后,头尾指针的变换要注意,因为此次循环结束i会自增一,因此i要在j指针的前一个位置,在进行下一轮循环之后,因其自增一也就在了j的位置。

#include <iostream>
#include <vector>//开辟动态数组
#include <algorithm>
const int N = 100000+10;
using namespace std;
int a[N];//用于存储牛牛
vector<int> A;
int main()
{
    int n;
    cin>>n;
    for(int i = 1;i <= n;i ++ )
    {
        cin>>a[i];//输入数组内的元素
        A.push_back(a[i]);//将所有数组内的元素装进动态数组
    }
    sort(A.begin(),A.end());//对于动态数组之中的元素进行排序
    A.erase(unique(A.begin(),A.end()),A.end());//去重
    int ans=0;
    for(int o = 0;o < A.size();o ++ )//依次筛选动态数组当中的每个元素
    {
        for(int i = 1;i <= n;i ++ )//双指针算法形成滑动窗口
        {
            int j = i;
            int d = 0;//设置偏移量
            while(a[j]==a[i]||a[j]==A[o])//如果后指针遇见了与前指针相同的元素或者与筛选元素相同的元素那么继续后移
            {
                if(a[j]==a[i])j++;//相同元素后移
                if(a[j]==A[o])//与筛选元素相同则继续后移,偏移量加一
                {
                    j++;
                    d--;
                }
            }
            ans=max(ans,j-i+d);//最后所取得的答案即为j-i+d
            i=j-1;//更新头指针
        }
    }
    cout<<ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/125112551