问题描述
机器翻译原理:碰到单词现在内存里寻找,若没有再到外存取寻找。内存中有多个单元,一个单元可以存储一个单词。假设有m个单元,若内存中有m-1个单元被用,那么从外存中查找的单词可以存储;若m个单元都被存储,删去最先进入单元的单词,继续存储。现给出内存容量m,文章长度n,问查完一篇文章要到外存去查找几次。
输入
第一行为两个正整数M和N,代表内存容量和文章的长度。
第二行为N个非负整数,按照文章的顺序,每个数(大小不超过1000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。
输出
包含一个整数,为软件需要查词典的次数。
样例输入
3 7
1 2 1 5 4 4 1
样例输出
5
算法讨论
简单的模拟,考虑到范围很小,纯粹的暴力就能过。时间复杂度O(n²)。
const
maxn=1000;
var
a:array[1..maxn] of longint;
b:array[1..101] of longint;
f:array[0..maxn] of boolean;
i,j,k,s,n,m:longint;
begin
read(n,m);
for i:=1 to m do
read(a[i]);
for i:=1 to m do
begin
if f[a[i]]=false
then begin
inc(s);
inc(j);
b[j]:=a[i];
f[a[i]]:=true
end;
if j>n
then begin
f[b[1]]:=false;
for k:=2 to j do
b[k-1]:=b[k];
dec(j)
end;
end;
write(s)
end.
Pixiv ID:59781074