当所需页面不在内存中时,分为三种情况,当前内存中的页面数小于内存最大页面数时,添加一个新的页面为即当前所需页面,如果内存已满,则找出内存中的页面哪个页面下一次出现的最晚,或者是哪个页面不在出现,将它置换出来即可
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<string>
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
using namespace std;
#define ll long long
const int N = 5e4 + 15;
int a[N];
int main()
{
int n, m, q;
while(cin >> n >> m >> q){
queue<int>qu[N];
set<int>st;
set<int>s;
for(int i = 0; i < q; i++)
cin >> a[i], qu[a[i]].push(i), s.insert(a[i]);
if(n >= m){
cout << s.size() << endl;
continue;
}
int res = 0;
for(int i = 0; i < q; i++){
//内存中已有此页面,从等待队列中剔除
if(st.count(a[i]) != 0)
qu[a[i]].pop();
//内存未满,添加新页面
else if(st.size() < n){
st.insert(a[i]);
qu[a[i]].pop();
res += 1;
}
else{
int p = 0, pos = -1;
for(auto x : st){
//这个页面不在需要,置换出去
if(qu[x].empty()){
p = x;
break;
}
//这个页面下次出现次数将最晚,置换
if(qu[x].front() > pos){
pos = qu[x].front();
p = x;
}
}
st.erase(p);
st.insert(a[i]);
qu[a[i]].pop();
res += 1;
}
}
cout << res << endl;
}
return 0;
}
京公网安备 11010502036488号