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 ...
随机推荐
- AC自动机:Tire树+KMP
简介 AC自动机是一个多模式匹配算法,在模式匹配领域被广泛应用,举一个经典的例子,违禁词查找并替换为***.AC自动机其实是Trie树和KMP 算法的结合,首先将多模式串建立一个Tire树,然后结合K ...
- 2021春季学期华清大学EE数算OJ3:岩石的重量
原题目如下: 看起来,这不过是我们在<程序设计基础>里面接触过的简单动态规划问题(什么,你不知道什么叫动态规划? 什么是动态规划? 百度百科对"动态规划"一词定义如下: ...
- Spring Boot整合模板引擎thymeleaf
项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --> <dependency> <groupId>org.springframew ...
- unity---角色控制器控制角色移动
获取对象 public CharacterController cc; cc=gameObject.GetComponent<CharacterController>(); if(Inpu ...
- TKE qGPU 通过 CRD 管理集群 GPU 卡资源
作者 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理经验,现负责腾讯云 GPU 容器的研发工作. 背景 目前 TKE 已提供基于 qGPU 的算力/显存强隔离 ...
- Vben Admin 源码学习:项目初始化
0x00 前言 Vue-Vben-Admin 是一个免费开源的中后台模版.使用了最新的vue3,vite2,TypeScript等主流技术开发,开箱即用的中后台前端解决方案考. 本系列本着学习参考的目 ...
- SSMS设置为深色模式
更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2022年2月8日. 2022年4月16日:SSMS很好用,但现在我更多使用DataGrip了. 2022年6月11日:S ...
- dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能
我对几个应用进行严格的启动性能评估,对比了在 .NET Framework 和 dotnet 6 下的应用启动性能,非常符合预期的可以看到,在用户的设备上,经过了 NGen 之后的 .NET Fram ...
- 使用Vite2+TypeScript4+Vue3技术栈,如何入手开发项目
前言 今天,我们使用Vite2.0+Vue3+TS来试玩一下,开发一个demo项目.实战 我们,打开Vite官方网站(https://cn.vitejs.dev/). Vite (法语意为 " ...
- FICO 常用事务码
1.SAP配置流程 1.定义,定义组织,概念,比如FI中定义公司代码,会计科目表,年度变式.SAP中有大量的定义过程. 2.分配,把会计科目表/公司/年度变式等参数分配到公司代码,逻辑组织,基本实现框 ...