题目

链接:https://ac.nowcoder.com/acm/contest/28537/F
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

在学习Operating System的过程中,Glory遇到了这样一个问题,现在有一个大小为可以容纳N个页面的内存,硬盘内的内容被分成M个页面,用1~M来标识,一开始内存里没有任何页面,接下来用户会请求Q个页面,你需要设计一个置换算法,使得缺页发生的次数最少。缺页是指用户请求某个编号的页面,但这个页面没有在内存中的情况。发生缺页之后,你必须要把硬盘内对应的页面调入内存中,如果内存已满,你需要置换掉当前内存中的某个页面。

输入描述:

多组数据,请处理到输入结束。
每组数据,第一行为三个整数N,M,Q (0 < N,M,Q <= 50000)
接下来一行Q个数,表示用户请求的页面编号。

输出描述:

对于每组数据,输出一个数,表示最少的缺页次数。

示例1

输入

2 3 5
3 1 2 1 2
3 4 5
3 2 1 4 3

输出

3
4

题解

突破点一:目前我所知道的在一个容器中取最值的方法有

  1. 优先队列 时间复杂度为logn;(适用于本道题目)
  2. 单调栈/队列 时间复杂度为1;(适用于滑动窗口)

突破点二:使用贪心

贪心,对于要被替换的元素,找到一个下一个该元素距离这个位置最远的元素来进行替换

突破点三:

由于优先队列可以自定义排序,所以我打算在优先队列里面存放下标

卡了3个小时的点:(std为我写的.test为标程)

注意优先队列仅仅是一个共具,实际上起到判断作用的是数组…

在找到一个相同的值以后,本应该更新一下值,但是太麻烦,索性直接push一个新的值,这样就可以了掩盖掉之前陈旧的数据

代码

#include <iostream>
#include <stack>
#include <string>
#include <queue>
#include <cstring>
using namespace std;//我的打算是把数组放到前面,之后直接初始化.
const int MAX = 50005;
int a[MAX];
int being[MAX] = { 0 };
int next_[MAX];
int next_assist[MAX];
int ans = 0;
priority_queue<pair<int, int> >q;
int cnt;
void clear(priority_queue<pair<int, int> >& q)
{
priority_queue<pair<int, int> >empty;
empty.swap(q);
}
void init()
{
ans = 0;
clear(q);
memset(a, 0, sizeof(a));
memset(being, 0, sizeof(being));
memset(next_assist, 0x7f, sizeof(next_assist));
memset(next_, 0, sizeof(next_));
cnt = 0;
}
int main()
{ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); int N, M, Q;
while (cin >> N >> M >> Q)
{
init();
for (int i = 1; i <= Q; i++)
{
cin >> a[i];
}
for (int i = Q; i >= 1; i--)
{
next_[i] = next_assist[a[i]];
next_assist[a[i]] = i;
}
cnt = 0;
ans = 0;
for (int i = 1; i <= Q; i++)
{
if (!being[a[i]] && ans >= N)
{
ans++;
being[q.top().second] = 0;
q.pop();
q.push(pair<int, int>(next_[i], a[i]));
being[a[i]] = 1;
}
else if (!being[a[i]] && ans < N)
{
cnt++;
q.push(pair<int, int>(next_[i], a[i]));
being[a[i]] = 1;
ans++;
}
else
{
q.push(pair<int, int>(next_[i], a[i]));
}
}
cout << ans << endl;
} }

Operating System_via牛客网的更多相关文章

  1. 牛客网 --java问答题

    http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...

  2. 牛客网《BAT面试算法精品课》学习笔记

    目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...

  3. C++版 - HDUoj 2010 3阶的水仙花数 - 牛客网

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - ...

  4. 牛客网第9场多校E(思维求期望)

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the ...

  5. 牛客网暑期ACM多校训练营(第七场)Bit Compression

    链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...

  6. Beautiful Numbers(牛客网)

    链接:https://ac.nowcoder.com/acm/problem/17385来源:牛客网 题目描述 NIBGNAUK is an odd boy and his taste is stra ...

  7. 牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  8. 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)

    链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  9. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

随机推荐

  1. Focal and Global Knowledge Distillation for Detectors

    一. 概述 论文地址:链接 代码地址:链接 论文简介: 此篇论文是在CGNet上增加部分限制loss而来 核心部分是将gt框变为mask进行蒸馏 注释:仅为阅读论文和代码,未进行试验,如有漏错请不吝指 ...

  2. 2022年5月11日,NBMiner发布了41.3版本,在内核中加入了100%LHR解锁器,从此NVIDIA的显卡再无锁卡一说

           2022年5月11日,NBMiner发布NBMiner_41.3版本,主要提升了稳定性.         2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核 ...

  3. 个人冲刺(三)——体温上报app(一阶段)

    任务:完成了app第二页面的页面布局 activity_second.xml <?xml version="1.0" encoding="utf-8"?& ...

  4. [2018-03-04] 利用 Settings Sync 插件同步 VS Code 设置

    VS Code 已原生支持设置同步,本文仅备份记录 [2018-03-04] 早就听说这个插件了,今天用了一下,确实挺方便的.通过把配置文件创建为 Gist 上来实现了 VS Code 设置的同步,下 ...

  5. vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)

    前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...

  6. 清明欢乐赛(USACO选题)

    总传送门 T1. [USACO19JAN] Redistricting P luogu P5202 思路: 这种每次选出段长有个上限\(k\)的常常是和单调队列有关. 这里是单调队列优化dp 不过一开 ...

  7. 浅析 2D 组态与 2.5D 组态的区别 | 空调装配生产线与化工安全流程

    前言 为了更有效辨别 2D 与 2.5D 之间的区别,图扑软件选用 2D 空调装配生产线与 2.5D 化工厂安全流程作比较.通过自主研发的 HT 产品,采用 B/S 架构快速搭建零代码拖拽式 Web ...

  8. Prometheus 四种metric类型

    Prometheus的4种metrics(指标)类型: Counter Gauge Histogram Summary 四种指标类型的数据对象都是数字,如果要监控文本类的信息只能通过指标名称或者 la ...

  9. 【NOIP2017 提高组正式赛】列队 题解

    题目大意 有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令 向左看齐.这时第一列保持不动,所有学生向左填补空缺.这条指令之后,空位在第 \(x\) 行第 ...

  10. 14.Nginx搭建及优化

    Nginx搭建及优化 目录 Nginx搭建及优化 Nginx服务基础 概述 Nginx和Apache的优缺点比较 编译安装Nginx服务 添加Nginx系统服务 Nginx服务配置文件 nginx服务 ...