#include<bits/stdc++.h>
using namespace std;
int x,y,q,l,s,ans,b[100001],a[100001];
int main(){
cin>>x>>y;
for(int i=1;i<=y;i++)
{
cin>>q;
if(a[q]==0)
{
ans++;
b[ans]=q;
a[q]=1;
if(ans>x)
{
l++;
a[b[l]]=0;
}
}
}
cout<<ans;
return 0;
}
考试时:这道题很常规,常见的思路是将他们读入,达到m个就从第一个开始替换反正是按先后读入的。
考试后:然后这道题我只得了90分,具体原因如下:
一,我需要在它的长度大于m时再考虑替换,如果我不分情况,直接for循环1到m的话很简单,他会把本来是空位算作0,这时候你就无法读入0。换言之,只要是前期读入了0的数据,我都会出错,所以得90分只是我运气好。
然后在洛谷上搜才发现这道题我做过的,方法完全不一样,就是记录每一个长度下最后输入的一个值。将每个出现过的数做标记。当长度大于m时,再从长度为1开始将标记重新清零。
这道题很简单,但是一定要细心。