题目传送门 P1540 机器翻译
思路分析
我们仔细看题目这一段
假设内存中有M个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M-1,软件会将新单词存入一个未使用的内存单元;若内存中已存入M个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。
清空最早那个单词,存放新单词,我们用样例模拟一下就是这样
所以这题我们可以用指针做
用指针l指最左边,r指最右边,存入一个单词后r++,如果r>m,那么左指针l所指的数清零,l++
这里开两个数组作内存,第一个数组a是类似一个桶,初始值为零,如果对应下标的数字存入b数组(b数组是内存)里,该数置为1,所以搜索输入的x时只需要判断a[x]即可
我们来看代码
#include<iostream>
using namespace std;
int a[1005],b[1005]; //a,b数组作用已经说过
int n,m,x;
int main(){
cin>>m>>n;
int l=0,r=0; //指针初始化,这里很巧妙,至于为什么继续看下面的语句
int ans=0; //这个是计数器
for(int i=1;i<=n;i++){
cin>>x; //我们边输入边做
if(a[x]==0){ //判断有没有存过这个数
r++; //r要先++,再让b[r]=x,所以初始化时r要等于0,不然不好处理
b[r]=x;
ans++; //到这里为止查完一次字典所以计数器++
a[x]=1; //置为1表示查过了
if(r>m) { //r大于了内存范围,左边的指针就要挪一位
l++;
a[b[l]]=0;} //虽然b数组并不是从0开始,但是由于l要++,所以l初始化要为0
}
}
cout<<ans;
return 0; //代码没有return 0;你的成绩return 0;
}