#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