牛客:机器翻译
解法一:暴力判断
对于每个新输入的元素,检查它是否在最近出现的
m
个元素中(即 “缓存窗口” 内);若在窗口内:该元素是重复的,不计数;
若不在窗口内:该元素是新的,加入统计,并更新 “最近元素窗口”。
#include<bits/stdc++.h> using namespace std; int main(){int m,n;int cont=0;int pos=0;cin>>m>>n;vector<int> vis(n);for(int i=0;i<n;i++){int x;cin>>x;bool flag=false;for(int j=pos;j>0&&j>pos-m;j--){if(vis[j]==x){flag=true;break;}}if(flag) continue;vis[++pos]=x;}cout<<pos;return 0; }
解法二:
每个新元素先检查是否已在缓存中(用
vis
数组标记);若已在缓存:不做处理,跳过;
若不在缓存:加入缓存,同时标记为 “已存在”;
若加入后缓存容量超过
m
:淘汰最早加入缓存的元素(遵循 “先进先出” FIFO 规则),并取消其 “已存在” 标记;最终输出所有曾被有效处理(加入过缓存)的元素总数。
用一个标记数组和一个缓存数组,如果vis标记数组里面没有标记,检查到了之后就标记,并且加入缓存,如果缓存满了则把最早的一个标记解除,表示把它踢出缓存
#include<bits/stdc++.h> using namespace std; int main(){int m,n,x;int pos=0;cin>>m>>n;vector<int> vis(1001);vector<int> a(1001);for(int i=0;i<n;i++){cin>>x;if(vis[x]==1) continue;a[++pos]=x;vis[x]=1;if(pos>m){vis[a[pos-m]]=0; }}cout<<pos;return 0; }