#include <bits/stdc++.h>
using namespace std;
int a[2000];
int main(){
    //freopen("translate.in","r",stdin);
    //freopen("translate.out","w",stdout);
    ios::sync_with_stdio(false);
    int m,n,k,cnt=0,head=1,tail=0,flag=0,ans=0,s=0;
    cin>>m>>n;
    for(int i=1;i<=n;i++){
        flag=0;
        cin>>k;
        for(int j=head;j<=tail;j++){
            if(a[j]==k){
                flag=1;
            }
        }
        if(flag==0){
            //if(i==10)cout<<cnt<<" "<<head<<endl;
            bool jud=0;
            if(cnt==m){
                cnt-=1; head++;
                tail++; a[tail]=k; jud=1;
            }
//cautious:pre.judge the boundary to avoid making a mistake that update again
            if(cnt<m and jud==0){
                tail++; a[tail]=k; cnt++; 
                if(cnt==m and head!=1) head++;
            }
            ans++;
出现问题:对于一个周期的过程没有想清楚细节,当cnt-1时head+1当时没考虑,所以要在脑子中带有细节地简单模拟 
            //if(i==10) cout<<head<<" "<<a[head]<<" "<<a[tail]<<" "<<cnt<<endl;
            //if(i==11) cout<<head<<" "<<a[head]<<" "<<a[tail]<<" "<<cnt<<endl;
               //for(int x=head;x<=tail;x++) cout<<a[x]<<" ";
            //cout<<endl;
        }
    }
    cout<<ans;
//cautious:to those parts you don't have a good command of please build some datas to have a try
//this time you make a mistake 
}

小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语
文章。

题目描述

这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用
对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这
个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存
中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻
译,并将这个单词和译义放入内存,以备后续的查找和翻译。

假设内存中有 MM 个单元,每单元能存放一个单词和译义。每当软件将
一个新单词存入内存前,如果当前内存中已存入的单词数不超过 M-1M−1
,软件会将新单词存入一个未使用的内存单元;若内存中已存入 MM 个
单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词

假设一篇英语文章的长度为 NN 个单词。给定这篇待译文章,翻译软件
需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词

输入输出格式

输入格式:
共 22 行。每行中两个数之间用一个空格隔开。

第一行为两个正整数 M,NM,N ,代表内存容量和文章的长度。

第二行为 NN 个非负整数,按照文章的顺序,每个数(大小不超过
10001000 )代表一个英文单词。文章中两个单词是同一个单词,当且仅
当它们对应的非负整数相同。

输出格式:
一个整数,为软件需要查词典的次数。

输入输出样例
输入样例#1: 复制
3 7
1 2 1 5 4 4 1
输出样例#1: 复制
5