1.题意:给定一段长度为N个单词的文章(一个单词用一个非负整数表示),可以使用一个容量为M个元素的容器。你的任务是使用字典的帮助翻译文章,遇到一个单词,查询之后将此单词的释义放入容器中,下次遇到时若此释义还在容器中就可以不用查字典直接得到结果。当容器已满,再遇到需要进入容器的单词,将容器中最早进入的单词剔除,将当前的单词加入。最后要求给出整个过程中需要查字典的次数。

2.分析:根据题意中容器的描述很容易想到使用队列来实现,同时还需要一个数组inq表示各个单词是否在队列中,一个变量num维护当前队列中的元素数量来决定是否继续push进队还是要pop队首再push

PS:Vijos上M,N的数据范围给反了,若不注意可能一直WA,N应该是N<=1000

代码如下,C++版:

 # include <iostream>
# include <cstdio>
# include <cstring>
# include <queue>
using namespace std;
int inq[];
int L[];
int M,N;
void Init()
{
memset(inq,,sizeof(inq));
for(int i=;i<N;i++)
scanf("%d",&L[i]);
}
void Solve()
{
int cnt=;
int inqnum=;
queue<int> Q;
for(int i=;i<N;i++)
{
int temp=L[i];
if(inq[temp]) continue;
else
{
cnt++;
if(inqnum<M)
{
Q.push(temp);
inqnum++;
inq[temp]=;
}
else
{
int tt=Q.front();
inq[tt]=;
Q.pop();
Q.push(temp);
inq[temp]=;
}
}
}
printf("%d\n",cnt);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d%d",&M,&N)!=EOF)
{
Init();
Solve();
}
return ;
}

Python版:

 class SQueue():
def __init__(self,init_len=2):
self._len=init_len
self._elems=[0]*init_len
self._head=0
self._num=0
def is_empty(self):
return self._num==0
def peek(self):
#if self._num==0:
# raise QueueUnderflow
return self._elems[self._head]
def dequeue(self):
#if self._num==0:
# raise QueueUnderflow
e=self._elems[self._head]
self._head=(self._head+1)%self._len
self._num-=1
return e
def enqueue(self,e):
if self._num==self._len:
self.__extend()
self._elems[(self._head+self._num)%self._len]=e
self._num+=1
def __extend(self):
old_len=self._len
self._len*=2
new_elems=[0]*self._len
for i in range(old_len):
new_elems[i]=self._elems[(self._head+i)%old_len]
self._elems,self._head=new_elems,0
while True:
try:
M,N=map(int,raw_input().split())
L=map(int,raw_input().split())
inq=[0]*1005
cnt=0
inq_num=0
Q=SQueue()
for i in range(N):
temp=L[i]
#print inq[temp]
if inq[temp]==1:
continue
else:
cnt+=1
if inq_num<M:
inq_num+=1
inq[temp]=1
Q.enqueue(temp)
else:
tt=Q.dequeue()
inq[tt]=0
Q.peek()
inq[temp]=1
Q.enqueue(temp)
print cnt
except:
break

Vijos1774 机器翻译 [模拟]的更多相关文章

  1. P1540 机器翻译 模拟

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  2. TZOJ 4813 机器翻译(模拟数组头和尾)

    描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查找这 ...

  3. NOIP2010 提高组合集

    NOIP 2010 提高组合集 T1 机器翻译 模拟题,用一个栈模拟,桶记录即可. #include <iostream> #include <cstdio> #include ...

  4. $NOIp$做题记录

    虽然去年做了挺多了也写了篇一句话题解了但一年过去也忘得差不多了$kk$ 所以重新来整理下$kk$ $2018(4/6$ [X]积木大赛 大概讲下$O(n)$的数学方法. 我是从分治类比来的$QwQ$. ...

  5. $NOIp$提高组历年题目复习

    写在前面 一个简略的\(NOIp\)题高组历年题目复习记录.大部分都有单独写题解,但懒得放\(link\)了\(QwQ\).对于想的时候兜了圈子的题打上\(*\). \(NOIp2018\ [4/6] ...

  6. 模拟--P1540 机器翻译

    题目连接 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词 ...

  7. 洛谷P1540 机器翻译 水题 模拟

    注意一下细节,尤其是更新minv时不要更新错. Code: #include<vector> #include<iostream> #include<cstdio> ...

  8. (简单模拟)P1540 机器翻译

    题解: #include<iostream>#include<cmath>using namespace std; int main(){ int m,n; cin>&g ...

  9. 【队列+模拟】机器翻译 luogu-1540

    题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查 ...

随机推荐

  1. MyBatis的基本用法

    MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使 ...

  2. SQL Server —— 主键和外键

    一.定义 1.1.什么是主键和外键 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级)其中 ...

  3. mysql列转行 行转列

    列转行 SELECT flag ,substring_index(substring_index(t.context,), ) as result FROM ( select 'aa' as flag ...

  4. 5G时代-计算机和网络的又一个春天

    预言 5G时代的到来计算机和网络即将再次变成热门,计算机和网络的前途将不可限量,就经济学思想来说一定是最具有经济价值的技术,计算机和网络将蓬勃发展,迅速膨胀,经济价值变得极高.将成为科技和智能生活的最 ...

  5. 使用Laravel5做权限管理

    https://www.imooc.com/article/18250 关于权限管理的思考 最近在用laravel设计后台,后台需要有个权限管理.权限管理实质上分为两个部分,首先是认证,然后是权限.认 ...

  6. 20-1 django上传文件和项目里上传头像如何查看

    一 普通上传方式 1 views def upload(request): if request.method == "POST": # print(request.POST) # ...

  7. java基础-内存分配

    1.java运行时的数据区:程序计数器.方法区.虚拟机栈.本地方法栈.堆 ①.程序计数器:一块较小的内存空间,可看作当前线程所执行的字节码的行号指示器 ②.java虚拟机栈:与程序计数器一样,也是线程 ...

  8. sqlserver 序号重新计算

    DBCC CHECKIDENT('leshua_TradeData',NORESEED) DBCC CHECKIDENT('表名',NORESEED)

  9. HDFS概念

  10. CSDN-Java培训 - 看看这次会有多少人跟风...

    2019年5月8日,闲来无事(最近答辩还没事......),存个档. 看看这一波风口,记录互联网+教育.