这是2010提高组第一题,是一个使用队列的模拟题(然而洛谷很多大佬用了最短路)
这道题首先要判断内存中是否已有解释(因为题目已经说了长度很小,所以可以用桶排序),没有的话便去外存找,找到后,存到内存的尾部。如果内存已经满了,那么弹出头部。所以,这道题一看就是要使用队列。然而我手写的队列不给力,最后看了题解用了STL才AC,心里很难受。
1.掌握队列的STL(size,front,pop,push)
2.注意看题目条件,不要老想着用循环判断一件事,想想其余方法,如桶排序,,
3.写选择语句时,尽量光写两个不一样的,具有共同点的写在一起。
#include<iostream> #include<cstdio> #include<cmath> #include<stack> #include<queue> #define N 100001 using namespace std; bool memory[N]; queue <int> q; int m,n; int dic; int main(){ cin>>m>>n; for(int i=1;i<=n;i++){ int x; cin>>x; if(memory[x]==true){ continue; } else{ if(q.size()>=m){ memory[q.front()]=false; q.pop(); q.push(x); dic++; memory[x]=true; } else{ dic++; q.push(x); } } } cout<<dic; cout<<endl; return 0; }