题解 | #机器翻译#
机器翻译
https://ac.nowcoder.com/acm/problem/16589
// 思路:1、先判断该单词是否已经在内存里了
// 2、如果在,则直接continue,
// 3、如果不在,cnt直接++;并进一步判断:查看内存是否已经满了,在题中用m表示,m>0就 // 表示还没满,
// 4、没满就可以直接把该单词添加进内存,即放在数组里,并让a[x]=i,i代表时间,
// 5、如果满了,就遍历一遍数组把最小的找出来,(即i最小的)并让他的值变为0踢出去,
// 6、再把新的单词加进来即可。
// 7、最后输出cnt
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int m,n;
int cnt=0; //cnt是查找的次数
int a[1020];
int main(){
IOS;
cin>>m>>n;
for(int i=1;i<=n;i++){ //主意不要从 i=0;i<n;i++;因为我后面同时用i代表时间,i=0会带来麻烦,不然的话时间就不要用i
int x;cin>>x;
if(a[x]!=0)continue;
cnt++;
if(m>0){
a[x]=i;//i是时间,通过时间去判断哪个单词是最早进入内存的
m--;
}
else{
int minn=i,num=0;
for(int j=0;j<=1000;j++){ //遍历数组找出进入内存时间最早的单词
if(a[j]<minn && a[j]!=0){
minn=a[j];
num=j;
}
}
a[num]=0;
a[x]=i;
}
}
cout<<cnt;
}