跳转至

例题-机器翻译

题目大意

内存中有 \(M\) 个单元,每个单元可以存储一个单词和其意译。

现有 \(N\) 个单词,刚刚开始内存空间是空的,什么都单词和其意译都没有存,每读取一个新单词时就会上网搜索该单词的含义,并将其存进内存空间中,若下次再遇到该单词并且还在内存空间中的话,就不用上网再搜一遍。

若单词太多的话,内存空间不够用,此时就要将最早放入内存中的单词和其意译删除掉,腾出一个新空间放入内存中。

请问该机器要上网搜多少次才能将这些单词翻译完毕?

输入格式

第一行输入两个整数,分别代表 \(M、N\)

第二行输入 \(N\) 个整数,每个整数都代表一个单词,当两个整数的数值相同时,这两个整数代表的单词也相同。

输出格式

输出一个整数代表上网搜索的次数。

数据范围

\(1 \leq M \leq 100\)

\(1 \leq N \leq 1000\)

每个单词所对应的整数 \(\in [0, 1000]\)

思路

定义一个数组 a[i] 代表单词 i 是否存在队列中,若 a[i] = 1 说明单词 i 存在队列中,否则就不存在队列中,此时就要将其存入队列中,并且查找次数要递增 \(1\)

代码参考
#include <iostream>
#include <queue>

using namespace std;
const int N = 1e7 + 10;

int a[N], t, n, m, res;
queue<int> qa;

int main(void)
{
    cin >> m >> n;
    for (int i = 1; i <= n; i ++) 
    {
        cin >> t;
        if (!a[t]) 
        {
            a[t] = 1, res ++;
            if (qa.size() == m) 
            {
                a[qa.front()] = 0; qa.pop();
            }
            qa.push(t);
        }
    }
    cout << res << endl;

    return 0;
}