本题是一个贪心问题,关键在于贪心策略如何选择。
想要缺失的可能性尽可能少,首先可能就想到丢掉后面出现次数少的,但比起出现次数顺序更加重要。最后得到贪心策略为:去掉最近的。
在本题中算法如何实现也不容器,应当保存下标才方便,否则如果相同的时候会有不必要的麻烦。
#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;
}