w4 P1540 [NOIP2010 提高组] 机器翻译

发布时间 2023-04-11 19:28:03作者: RUI_26

 

 

 

 主要思路:因为题目要求内存满后要扔出最先进去的单词,于是就想到用queue。每查找一次要查找的单词是否已在内存内,不在则查找次数+1,把单词放入内存,同时内存大小+1。然后判断此时的内存大小是否超出给定大小,超出则pop,为超出则继续。

代码如下:

#include<iostream>
#include<queue>
using namespace std;
int N,M,ans,tmp; //ans为查词典次数,tmp为当前内存大小
int flag[1010]; //记录单词是否在内存内
int main()
{
  queue<int> q;
  cin>>M>>N;
  for(int i=0;i<N;++i){
    int word; //要查找的单词
    cin>>word;
    if(flag[word]==0){ //若单词不在内存内
      ans++; //查词典次数+1
      q.push(word); //把单词放入内存
      tmp++; //内存大小+1
      flag[word]=1; //记录单词已在内存内
    }  
    else if(flag[word]==1){ //要查找的单词不在内存内
      continue;
    }
    if(tmp>M){ //判断当前内存是否已经超出给定大小
      flag[q.front()]=0; //记录被扔出单词不在内存内
      q.pop(); //扔出单词
      tmp--; //内存大小-1
    }
  }
  cout<<ans<<endl;
  return 0;
}