本题是一个贪心问题,关键在于贪心策略如何选择。
想要缺失的可能性尽可能少,首先可能就想到丢掉后面出现次数少的,但比起出现次数顺序更加重要。最后得到贪心策略为:去掉最近的。
在本题中算法如何实现也不容器,应当保存下标才方便,否则如果相同的时候会有不必要的麻烦。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000+10;
map<int, int> mp;
int nexti[maxn];
int boo[maxn];
priority_queue<int, vector<int>, less<int> > pq;
int a[maxn];
int N, M;
int main() {
cin>>N>>M;
for (int i=1;i<=N;i++) {
cin>>a[i];
}
for (int i=N;i>=1;i--) {
if (mp[a[i]]==0) nexti[i] = maxn-9;
else nexti[i] = mp[a[i]];
mp[a[i]] = i;
}
int num = 0, ans = 0;
for (int i=1;i<=N;i++) {
if (boo[i]==0){
ans++;
if (num<M) {
pq.push(nexti[i]);
boo[nexti[i]] = 1;
num++;
} else {
boo[pq.top()]=0;
pq.pop();
pq.push(nexti[i]);
boo[nexti[i]] = 1;
}
} else {
pq.push(nexti[i]);
boo[nexti[i]] = 1;
}
}
cout<<ans;
return 0;
}

京公网安备 11010502036488号