FIFO
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;
int FIFO(int frames, vector<int> seq) {
queue<int> q;
unordered_map<int, int> idx;
vector<int> have(frames, 0);
int miss = 0;
for (auto x : seq) {
bool fault = false;
int pos = q.size();
if(idx.find(x) == idx.end()) { //当前块里面没有需要的数据
miss++;
fault = true;
if (q.size() == frames) {
int out = q.front();
q.pop();
pos = idx[out];
idx.erase(out);
}
q.push(x);
idx[x] = pos;
have[pos] = x;
}
//输出
//queue<int> tmp = q;
for (auto y : have) cout << y << ' ';
cout << (fault ? 'T' : 'F') << endl;
}
return miss;
}
int main(void) {
cout << "start" << endl;
int frames, n; cin >> frames >> n;
vector<int> seq(n);
for (int i = 0; i < n; ++i ) cin >> seq[i];
int miss = FIFO(frames, seq);
double rate = miss * 1.0 / n * 100;
printf("%s%.2f%c", "缺页率: ", rate, '%');
}
//样例来自作业16题 输出序列 缺页率
//5 20 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6
//样例来自作业14题 输出缺页率
//4 20 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6
LRU
//
// Created by xuchangzhen on 2026-06-03.
//
#include <iostream>
#include <vector>
#include <unordered_map>
#include <list>
using namespace std;
void remove_element(list<int>& lru_list, int pos, int ele){
for (list<int>::iterator it = lru_list.begin(); it != lru_list.end(); ++it) {
if (*it == ele) {
lru_list.erase(it);
return ;
}
}
}
int LRU(int frames, vector<int> seq) {
list<int> lru_list;
unordered_map<int, int> idx;
vector<int> have(frames, 0);
int miss = 0;
for (auto x : seq) {
bool fault = false;
int pos = lru_list.size();
if(idx.find(x) == idx.end()) { //当前块里面没有需要的数据
miss++;
fault = true;
if (lru_list.size() == frames) {
int out = lru_list.back();
lru_list.pop_back();
pos = idx[out];
idx.erase(out);
}
lru_list.push_front(x);
idx[x] = pos;
have[pos] = x;
}else{
pos = idx[x];
// cout << "in" << endl;
remove_element(lru_list, pos, x);
lru_list.push_front(x);
}
//输出
// cout << "list序列: ";
// for (auto y : lru_list) cout << y << ' ';
// cout << endl;
for (auto y : have) cout << y << ' ';
cout << (fault ? 'T' : 'F') << endl;
}
return miss;
}
int main(void) {
cout << "start" << endl;
int frames, n; cin >> frames >> n;
vector<int> seq(n);
for (int i = 0; i < n; ++i ) cin >> seq[i];
int miss = LRU(frames, seq);
double rate = miss * 1.0 / n * 100;
printf("%s%.2f%c", "缺页率: ", rate, '%');
}
//使用链表来表示最近使用的数据 长时间未被使用的数据会被挤到链表尾部
//样例来自作业16题 输出序列 缺页率
//5 20 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6
//样例来自作业14题 输出缺页率
//4 20 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6
//样例来自作业17题 输出缺页率
//3 12 4 3 2 1 4 3 5 4 3 2 1 5
//4 12 4 3 2 1 4 3 5 4 3 2 1 5