1 条题解

  • 0
    @ 2026-10-18 22:56:42

    [NOIP 2010 提高组] 机器翻译

    知识点

    模拟、队列、缓存

    解题思路

    队列保存单词进入缓存的先后顺序,布尔数组标记是否在缓存。命中时不改变顺序;未命中则计数,若已满就移除队首,再加入新词。

    正确性说明

    队列与标记数组始终表示当前内存。题目在未命中时淘汰最早进入者,与队首一致;命中不重新进入内存,故保持队列顺序。归纳得到每次查词典计数正确。

    易错点

    命中不能移到队尾;M=1也适用;词编号允许0;不同单词按数值判断。

    复杂度

    时间O(N),空间O(M+1001)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){int m,n;cin>>m>>n;queue<int>q;bool has[1001]={};int ans=0;while(n--){int x;cin>>x;if(has[x])continue;++ans;if((int)q.size()==m){has[q.front()]=false;q.pop();}q.push(x);has[x]=true;}cout<<ans<<'\n';}
    
    • 1

    信息

    ID
    398
    时间
    1000ms
    内存
    125MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者