算法
一道简单的模拟题,我们可以用数组来模拟队列:
1. 用两个指针head和tail分别指向队列的头和尾,tail初始化为0,head初始化为1
2. 由于每次读入的数用完以后就丢掉,所以只需要开开一个变量即可,也就是每次读入一个数,随即处理一个数就可以了
3. 其次也要开一个数组来记录数字有没有出现过
4. 每次读入一个数,判断它是否出现过,如果没出现过则q[++tail]=x,并把出现过的数字置为1即b[x]=1. 然后判断一下tail与head的差是否大于等于m(内存容量),如果是则把队头的元素置为0(即q[head]=0), 同时head向前移动一位。
C++ 代码
#include <iostream>
using namespace std;
int main() {
int m, n, x;
cin >> m >> n;
int q[n + 10], b[1010] = {0}, head = 1, tail = 0;
for (int i = 1; i <= n; i++) {
cin >> x;
if (!b[x]) {
q[++tail] = x;
b[x] = 1;
}
if (tail - head >= m) {
b[q[head]] = 0;
head++;
}
}
cout << tail;
return 0;
}