题意解析
题意让我们求剔除哪个相同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里面:
此时求一个最大长度:
第一轮的最大长度是2。
第二轮
求第二轮最大长度:
第二轮的最大长度是2。
第三轮
求第三轮的最大长度:
第三轮的最大长度是4.
第四轮
求第四轮的最大长度:
第四轮的最大长度是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;
}