Operating System_via牛客网
题目
链接: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
题解
突破点一:目前我所知道的在一个容器中取最值的方法有
- 优先队列 时间复杂度为logn;(适用于本道题目)
- 单调栈/队列 时间复杂度为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牛客网的更多相关文章
- 牛客网 --java问答题
http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...
- 牛客网《BAT面试算法精品课》学习笔记
目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...
- C++版 - HDUoj 2010 3阶的水仙花数 - 牛客网
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - ...
- 牛客网第9场多校E(思维求期望)
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the ...
- 牛客网暑期ACM多校训练营(第七场)Bit Compression
链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...
- Beautiful Numbers(牛客网)
链接:https://ac.nowcoder.com/acm/problem/17385来源:牛客网 题目描述 NIBGNAUK is an odd boy and his taste is stra ...
- 牛客网华为机试题之Python解法
牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...
- 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)
链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅
链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...
随机推荐
- 详解:什么是VXLAN?
点击上方"开源Linux",选择"设为星标"回复"学习"获取独家整理的学习资料! 本文介绍了什么是VXLAN,以及VXLAN的基本概念和工作 ...
- netty系列之:netty中常用的字符串编码解码器
目录 简介 netty中的字符串编码解码器 不同平台的换行符 字符串编码的实现 总结 简介 字符串是我们程序中最常用到的消息格式,也是最简单的消息格式,但是正因为字符串string太过简单,不能附加更 ...
- 其实 Gradle Transform 就是个纸老虎 —— Gradle 系列(4)
前言 目前,使用 AGP Transform API 进行字节码插桩已经非常普遍了,例如 Booster.神策等框架中都有 Transform 的影子.Transform 听起来很高大上,其本质就是一 ...
- 219. Contains Duplicate II - LeetCode
Question 219. Contains Duplicate II Solution 题目大意:数组中两个相同元素的坐标之差小于给定的k,返回true,否则返回false 思路:用一个map记录每 ...
- SQL中常用的字符串LEFT函数和RIGHT函数详解!
今天继续整理日常可能经常遇到的一些处理字符串的函数,记得点赞收藏!以备不时之需!看到最后有惊喜! LEFT(expression, length)函数 解析:从提供的字符串的左侧开始提取给定长度的字符 ...
- 个人冲刺(六)——体温上报app(二阶段)
冲刺任务:完成主页面功能 MainActivity.java package com.example.helloworld; import android.app.AlertDialog; impor ...
- mysql查询关键字补充与多表查询
目录 查询关键字补充 having过滤 distinct去重 order by排序 limit分页 regexp正则 多表查询 子查询 连表查询 查询关键字补充 having过滤 关键字having和 ...
- 测试平台系列(94) 前置条件该怎么支持Python呢
回顾 上一节我们狠狠操练了一番oss,但我们的任务还很长久,所以我们需要继续打磨我们的功能. 那今天就让我们来思考下,如何在前置条件支持python脚本,多的不说,我们也暂时不考虑其他语言,因为光考虑 ...
- 题解 CF1095F 【Make It Connected】
题意简述 \(n\)( \(1≤n≤2×10^5\) )个点,每个点 \(i\) 有一个点权 \(a_i\) ( \(1≤a_i≤2×10^{12}\) ),将两个点 \(i\),\(j\) 直接相连 ...
- 优秀开源平台,前后端分离快速开发平台,一站式多端开发(PC+APP)
JNPF平台架构介绍 JNPF快速开发平台采用前后端分离技术.采用B/S架构开发,形成一站式开发多端(APP+PC)使用. PC端版本介绍 第一个当然是当下热门的.net core了,运行环境为Vis ...