题解 | #机器翻译#
机器翻译
https://ac.nowcoder.com/acm/problem/16589
1.读入内存长度m和单词数量n;
2.for循环读入每个单词
如果这个单词不在内存中,查字典次数++
(1).如果内存满了,删掉先进去的元素,加入后进的元素
(2).如果内存没有满,加入后进去的元素,内存长度++
如果在内存中,不管他,读下一个
#include<bits/stdc++.h>
using namespace std;
int vis[1010];
//vis[21]=1表示21在内存中,vis[43]=0表示43不在内存中
int temp[1010];
//temp[1]=12表示输入的第一个数字是12,temp[4]=9表示输入的第4个数是9
int tempos=0;//记录temp数组的位置
int m,n;//记录内存空间大小和文章长度
int main()
{
cin>>m>>n;
int cnt=0,ans=0;//记录内存中数字个数和查字典次数
int num,i;
for(i=1; i<=n; i++)
{
cin>>num;
if(vis[num]==1)continue;//这个数在内存里,不管它
ans++;//不在内存里,要查一次字典
if(cnt>=m)//内存满了
{
vis[temp[tempos-m]]=0;//把前面进入内存的删掉
vis[num]=1;//标记新输入的已经有了
temp[tempos++]=num;//放入新输入的
}
else //内存没有满
{
vis[num]=1;//标记新输入的已经有了
temp[tempos++]=num;//放入temp数组中
cnt++;//内存中已有单词数+1
}
}
cout<<ans;
return 0;
}
2.for循环读入每个单词
如果这个单词不在内存中,查字典次数++
(1).如果内存满了,删掉先进去的元素,加入后进的元素
(2).如果内存没有满,加入后进去的元素,内存长度++
如果在内存中,不管他,读下一个
#include<bits/stdc++.h>
using namespace std;
int vis[1010];
//vis[21]=1表示21在内存中,vis[43]=0表示43不在内存中
int temp[1010];
//temp[1]=12表示输入的第一个数字是12,temp[4]=9表示输入的第4个数是9
int tempos=0;//记录temp数组的位置
int m,n;//记录内存空间大小和文章长度
int main()
{
cin>>m>>n;
int cnt=0,ans=0;//记录内存中数字个数和查字典次数
int num,i;
for(i=1; i<=n; i++)
{
cin>>num;
if(vis[num]==1)continue;//这个数在内存里,不管它
ans++;//不在内存里,要查一次字典
if(cnt>=m)//内存满了
{
vis[temp[tempos-m]]=0;//把前面进入内存的删掉
vis[num]=1;//标记新输入的已经有了
temp[tempos++]=num;//放入新输入的
}
else //内存没有满
{
vis[num]=1;//标记新输入的已经有了
temp[tempos++]=num;//放入temp数组中
cnt++;//内存中已有单词数+1
}
}
cout<<ans;
return 0;
}

查看10道真题和解析