2012. 一排奶牛 题型:双指针

70 阅读3分钟

2012. 一排奶牛 - AcWing题库

题意解析

image.png 题意让我们求剔除哪个相同id的牛之后 队列具有相同id的牛的连续长度最大。

第一种解法 队列

根据题意去模拟,题意说了,每次从队头选择一头牛的id,然后在数组a中剔除所有具有相同id的牛,然后计算具有相同品种 ID 的最大奶牛连续段的长度,然后弹出队头,下一个id顶到队头,继续计算,直到队列弹出为空,此时最大长度也就求出来了。

我们剔除相同id的时候也不用真的剔除,只需要统计一下除了它们之外的其他相同id之间的长度即可。

#include <iostream>
using namespace std;
const int N = 1010, M = 1000010;

int a[N];
bool st[M];

int q[M];
int hh, tt = -1;
int n;
int ans = 1;

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        if (!st[a[i]])
        {
            q[++tt] = a[i];
            st[a[i]] = true;
        }
    }

    while (hh <= tt)
    {
        int x = q[hh++];
        int j;
        int cnt = 1;
        for (int i = 1; i <= n; i++)
        {
            for (int j = i + 1; a[i] == a[j] || a[j] == x; j++)
            {
                if (a[j] == x)
                    continue;
                cnt++;
            }
            ans = max(ans, cnt);
            cnt = 1;
        }
    }
    cout << ans << endl;
    return 0;
}

第二种写法

思想

根据题意,我们需要去模拟剔除每个相同id的牛之后 队列的更新状况,针对新的队列 我们更新一下队列中具有相同id的牛的连续长度的最大值。

最后全部模拟完之后我们就得到答案了。

首先我们先把数组a里面的元素全部加入set,这样set里面存储的就是去重之后的数组a里面的每一个id。

然后我们枚举set里面的id 挨个去剔除数组a中具有相同id的所有元素,去除完之后再求个最大长度。

样例模拟

第一轮

除了a[0]和S[0]相同外i,其他的都不满足,全部加入到st里面:

image.png

此时求一个最大长度:

image.png

第一轮的最大长度是2。

第二轮

image.png

求第二轮最大长度:

image.png

第二轮的最大长度是2。

第三轮

image.png

求第三轮的最大长度:

image.png

第三轮的最大长度是4.

第四轮

image.png

求第四轮的最大长度:

image.png

第四轮的最大长度是2




最后我们发现在第三轮的时候最大长度是4,最四轮的最大长度是2,没有4大,因此最大长度还是保持为4,最大长度就是4。

code

#include <bits/stdc++.h>
using namespace std;
int n, x;
set<int>S;
int a[1010];

int main() {

	cin >> n;
       
       //set存储 数组a中的所有牛的id (因为有相同id的牛,所以要去重)
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		S.insert(a[i]);
	}


	int ans = 0;

	for (auto &it : S) {
		vector<int>st;

		for (int i = 1; i <= n; i++) {
			if (a[i] == it)    //剔除具有相同id的牛
				continue;
			else
				st.push_back(a[i]);
		}

		//求剔除之后的最大长度
		for (int i = 0, j = 0; i < st.size(); i++) {
			while (st[j] != st[i])
				j++;
			ans = max(ans, i - j + 1);
		}
	}


	cout << ans << endl;
	return 0;
}