链接:https://www.nowcoder.com/acm/contest/107/F
来源:牛客网
Operating System
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制: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:
先3 1,接下来在1之后遇到不是3,1,的开始找n个互不相同的,为2,1,所以要把3换成2,以此类推
#include<bits/stdc++.h> using namespace std; #define ll long long int a[50005]; bool v[50005]; bool v1[50005]; queue<int>q1; queue<int>q; int main() { int n,m,p; while(cin>>n>>m>>p) { long long s=0; memset(v,0,sizeof(v)); for(int i=1;i<=p;i++) cin>>a[i]; while(!q.empty()) q.pop(); int f1=0; bool ff=0; for(int i=1; i<=p; i++) { if(!v[a[i]]) { f1++; memset(v1,0,sizeof(v1)); while(!q1.empty()) q1.pop(); q1.push(a[i]); v1[a[i]]=1; int k=1; int j; for(j=i+1;j<=p;j++) { if(!v1[a[j]]) { v1[a[j]]=1; q1.push(a[j]); k++; } if(k==n) break; } if(k!=n) { ff=1; } i=j; while(!q1.empty()) { int x=q1.front(); q1.pop(); if(!v[x]) { v[x]=1; if(f1==1) { s++; } q.push(x); } } int pp=0; int qq=q.size (); if(ff==1&&f1!=1) { s+=qq-n; break; } else { while(!q.empty()) { int x=q.front(); q.pop(); pp++; if(!v1[x]) { v[x]=0; s++; } else q.push(x); if(pp==qq) break; } } } } cout<<s<<endl; } return 0; }
其实还有简单的方法:
unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个),还有一个容易忽视的特性是它并不真正把重复的元素删除。他是c++中的函数,所以头文件要加#include<iostream.h>,具体用法如下:
int num[100];
unique(num,mun+n)返回的是num去重后的尾地址,之所以说比不真正把重复的元素删除,其实是,该函数把重复的元素一到后面去了,然后依然保存到了原数组中,然后返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<math.h> #include<set> using namespace std; int n,m,q; int main() { while(cin>>n>>m>>q) { int a[50005]; for(int i=0;i<q;i++) scanf("%d",&a[i]); sort(a,a+q); int x=unique(a,a+q)-a; printf("%d ",x); } return 0; }