当遇到需要将主存单元加进cache的时候,就看cache里是否满了,满了的话,就删除离最靠后的那一个,这样一定最优。
但是网上博客的代码太长了。。。其实只需要判断一下当前的优先队列的top是否仍在cache中即可。
(重题:[POI2005]SAM-Toy Cars,AC数+=2
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> #include <queue> using namespace std; priority_queue<int>q; const int N=100005; int n,m,a[N],b[N],last[N],nxt[N],cnt,ans; bool vis[N]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+1+n);int u=unique(b+1,b+1+n)-b-1; for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+u,a[i])-b, nxt[last[a[i]]]=i,last[a[i]]=i; for(int i=1;i<=u;i++) nxt[last[i]]=n+i,a[n+i]=i; for(int i=1;i<=n;i++) { while(q.size()&&vis[a[q.top()]]==false) q.pop(); if(vis[a[i]]) {q.push(nxt[i]);continue;} if(cnt<m) { vis[a[i]]=1, cnt++,ans++, q.push(nxt[i]); continue; } vis[a[q.top()]]=0, ans++,q.pop(); q.push(nxt[i]); vis[a[i]]=1; } cout<<ans<<endl; return 0; }