题目描述
这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。
假设内存中有MM个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M-1M−1,软件会将新单词存入一个未使用的内存单元;若内存中已存入MM个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。
假设一篇英语文章的长度为NN个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。
输入输出格式
输入格式:
共22行。每行中两个数之间用一个空格隔开。
第一行为两个正整数M,NM,N,代表内存容量和文章的长度。
第二行为NN个非负整数,按照文章的顺序,每个数(大小不超过10001000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。
输出格式:
一个整数,为软件需要查词典的次数。
输入样例:
3 7
1 2 1 5 4 4 1
输出样例:
5
代码:
#include <cstdio>
#include <iostream>
#include <string.h>
#include <cstring> //用于使用memset
using namespace std;
int store[10000]; //store数组表示当前内存里的单词;
int check[10000]; //check数组是待查找的单词;
int main()
{
memset(store,-1,4*10000);
memset(check,-1,4*10000); //将两个数组都初始化为-1(测试数据里有0,所以不能初始化为0);
int m,n,i,j,k;
int time=0; //到外存中查找的次数,即store数组里没有,要存进来。
int flag=0; //当前查阅单词是否被查到;
int leng=0; //记录当前内存里的单词个数
scanf("%d%d",&m,&n);
for(i=0;i<n;i++) //依次输入待查找单词
{
scanf("%d",&check[i]);
}
for(i=0;i<n;i++)
{
flag=0; //待查找单词从第1个查到最后一个,开始查找之前,flag要置为0;
for(j=0;j<m;j++)
{
if(check[i]==store[j]) //从store数组里,即内存里找到所要查找单词;
{
flag=1;
break; //不必继续查找
}
}
if(flag==0) //内存中的单词遍历完毕,没有找到
{
time++; //次数+1
leng=0; //内存长度为0;
for(int g=0;g<m;g++) //计算内存长度
{
if(store[g]!=-1)
{
leng++;
}
}
if(leng<m&&leng>=0) //如果内存里的单词不超过M-1个;
{
for(k=0;k<m;k++)
{
if(store[k]==-1)
{
store[k]=check[i];
break;
} //直接将单词存进去;
}
}
else //超过了M-1个,要从第二个单词开始直到最后一个单词,依次往前移动;
{ //腾出最后一个空间。相当于删除了最开始存入的单词;
for(k=1;k<=m-1;k++)
{
store[k-1]=store[k]; //依次前移
}
store[m-1]=check[i]; //把新单词存到最后一个空间
}
}
/*for(int g=0;g<m;g++)
{
if(store[g]!=0)
{
printf("%d ",store[g]);
}
}
printf("\n");
*/ //for循环这段代码,用于输出每次检查后,内存中的单词情况;检查代码是否正确
}
printf("%d",time);
return 0;
}
欢迎交流!
2019/07/18