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