题解 | #机器翻译#
机器翻译
https://ac.nowcoder.com/acm/problem/16589
模拟这个过程
solution 1
判断单词是否在内存之中,我们用数组实现。如果以单词值为下标的数组vis值不为0,则表示这个单词在内存之中,遇到同样的单词,下标相同,数组元素值相同不为0,则不需要从外存词典读入。则实现了单词是否在内存的判断。
#include <stdio.h>
#include <stdlib.h>
int main() {
int m, n;
scanf("%d %d", &m, &n);
int vis[1111]={0} ;
//vis代表内存
int acc=0;//外存读取次数
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
if (vis[x] != 0) continue;
//如果单词x对应的vis【x】不为0则代表内存当中含有这个单词
//
else {
acc++;
if (m > 0)
//控制内存是否满了
{
vis[x] = i;//没在内存,要从外存读入,我们就让vis【x】的值为单词x从外存读入内存的时间(i)
m--;
}
//如果内存满了,就执行的操作,替换内存相对较早读入的单词,
else {
int min = i;
int pos;
for (int j = 0; j <= 1000; j++) {
if(vis[j]<min&&vis[j]!=0)
{
min=vis[j];
pos=j;
}
}
vis[x]=i;
vis[pos]=0;
}
}
}
printf("%d",acc);
return 0;
}
solution 2
#include <stdio.h>
#include <stdlib.h>
int m, n;
int main() {
scanf("%d %d", &m, &n);
int data[1200];
int vis[1200] = {0};//判断是否在内存之中
int temp[1200];//如果向内存中读入一个单词 data[i],就记录data[i]
int te=0,te2=0;//te2表示按照时间顺序读取读取在较早读入内存之中的单词
int acc=0;
for (int i = 1; i <= n; i++) {
scanf("%d", &data[i]);
if (vis[data[i]] != 0) continue;
else {
acc++;
if (m > 0) {
vis[data[i]] = 1;
temp[te++]=data[i];
m--;
} else {
vis[data[i]]=1;
vis[temp[te2++]]=0;
temp[te++]=data[i];
}
}
}
printf("%d",acc);
return 0;
}