题目

链接: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. springcloud + nacos实现共用基础服务(灰度版本)

    背景: 当我们使用微服务时,若想在本地联调就需要启动多个服务,为了避免本地启动过多服务,现将注册中心等基础服务共用.当我们在服务A开发时,都是注册到同一个nacos,这样本地和开发环境的服务A就会同时 ...

  2. 万字长文详解HBase读写性能优化

    一.HBase 读优化 1. HBase客户端优化 和大多数系统一样,客户端作为业务读写的入口,姿势使用不正确通常会导致本业务读延迟较高实际上存在一些使用姿势的推荐用法,这里一般需要关注四个问题: 1 ...

  3. Vue的computed和watch的使用和区别

    一.computed: 模板内表达式非常便利,可用于简单计算,当模板内放入太多的逻辑时,模板会过重且难以维护:可以使用computed替代 计算属性是基于它们的响应式依赖进行缓存的,当依赖的响应式数据 ...

  4. 单源最短路问题:OJ5——低德地图

    本题就是一道单源最短路问题.由于是稀疏图,我们采用Dijkstra算法. Dijkstra算法原理 Dijkstra算法的步骤 我们把所有的节点分为两个集合:被选中的(visited==1) 和 未被 ...

  5. 难对齐、难保障、难管理?一文了解字节跳动如何解决数据SLA治理难题

    基于字节跳动分布式治理的理念,数据平台数据治理团队自研了SLA保障平台,目前已在字节内部得到广泛使用,并支持了绝大部分数据团队的SLA治理需求,每天保障的SLA链路数量过千,解决了数据SLA难对齐.难 ...

  6. Vue路由的安装

    1.在Vue ui中插件中找到添加vue-router 2.安装以后,项目中的会自动完成配置. 3.在store中的index.js配置路由页面以及路径.

  7. pytorch基础常识

     

  8. Dev C++编写C/C++程序 出现[Error] ld returned 1 exit status报错分析及解决

    debug系列第一弹,不知道大家写程序的时候是不是都遇到过如题的报错. 我本人是经常遇到这行熟悉的令人不知所措的报错,可能是我太笨了 有时候百度无果也差不到原因,那就汇总一下目前我遇到的情况吧--持续 ...

  9. Ubuntu安装python固定版本

    一. 安装python3.7 本篇文章使用python3.7安装步骤为例 1.直接使用apt-get安装python3.7 apt-get install python3.7 该方法经常会出现unab ...

  10. Snowflake(雪花算法),什么情况下会冲突?

    文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUI ...