思考(与本题关系不大
主要是想通过这道题记录一下queue的模板
感觉之前为了赶进度有点丢掉了自己的初心
之前的想法就是看懂这个代码到底在干什么,然后完全脱离于教材上C语言的写法,自己写C++。由于我C++的部分知识的缺乏+为了赶进度,所以就搞出了不伦不类的一些代码…这种情况还是应该被避免的
思路:
至于本题的操作还是挺简单的,只要搞个vis[]判断一下是否在缓存里即可
第一种:左闭右开
#include <cstdio>
#include <iostream>
using namespace std;
int m,n;
bool vis[111111111];
struct QUEUE
{
int head,tail,data[11111];void init(){
head=0,tail=0;}int size(){
return tail-head;}int front(){
return data[head];}int back(){
return data[tail-1];}void pop(){
head++;}void push(const int &x){
data[tail]=x;tail++;}
}qu;
int main()
{
cin>>m>>n;int ans=0;for(int i=1;i<=n;i++){
int x;cin>>x;if(vis[x]) continue;if(qu.size()==m){
vis[qu.front()]=0;qu.pop();qu.push(x);vis[x]=1;ans++;}else{
qu.push(x);vis[x]=1;ans++;}}cout<<ans<<endl;return 0;
}
第二种:
#include <bits/stdc++.h>
using namespace std;
int n,m;
bool vis[111111111];
struct QUEUE
{
int head,tail,data[11111];void init(){
head=1,tail=0;}int size(){
return tail-head+1;}int front(){
return data[head];}int back(){
return data[tail];}void pop(){
head++;}void push(const int &x){
data[++tail]=x;}
}qu;
int main()
{
cin>>m>>n;int ans=0;for (int i=1;i<=n;i++){
int x;cin>>x;if (vis[x]) continue;if (qu.size()==m){
vis[qu.front()]=false;qu.pop();qu.push(x);vis[x]=true;ans++;}else{
vis[x]=true;qu.push(x);ans++;}}cout<<ans<<endl;return 0;
}