HDU 4398 Template Library Management

中等偏易题。操作系统理论中的最优页面调度算法,贪心。当需要淘汰某个模版时,淘汰掉当前手中在最远的将来才会被用到(或者以后永远不再用到)的那个。

代码:

 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cstdlib>
5 #include <cmath>
6 #include <algorithm>
7 #include <string>
8 #include <queue>
9 #include <stack>
10 #include <vector>
11 #include <map>
12 #include <set>
13 #include <functional>
14 #include <time.h>
15
16 using namespace std;
17
18 typedef pair<int, int> PII;
19
20 const int INF = 1<<30;
21 const int MAXN = (int) 1e5+11;
22
23 priority_queue<PII> q;
24 int Ti[MAXN], next[MAXN];
25 int Find[MAXN], len; //离散化用
26 int vis[MAXN]; //计算下一次出现用
27 bool inq[MAXN]; //判断是否拥有
28 int N, M;
29
30 void input() {
31 for (int i = 0; i < N; i++)
32 scanf("%d", &Ti[i]);
33 }
34
35 void solve() {
36 //离散化
37 for (int i = 0; i < N; i++)
38 Find[i] = Ti[i];
39 sort(Find, Find+N);
40 len = unique(Find, Find+N) - Find;
41 for (int i = 0; i < N; i++)
42 Ti[i] = lower_bound(Find, Find+len, Ti[i]) - Find;
43
44 //计算next[]
45 for (int i = 0; i <= len; i++) vis[i] = N+1; //初始化vis[]
46 for (int i = N-1; i >= 0; i--) {
47 next[i] = vis[Ti[i]];
48 vis[Ti[i]] = i;
49 }
50
51 int ans = 0, have = 0;
52 while (!q.empty()) q.pop(); //初始化队列
53 memset(inq, false, sizeof(inq));
54 for (int i = 0, j = 0; i < M; i++) { //一开始就有的模板
55 int t = Find[j]==(i+1) ? j++ : len;
56 q.push(make_pair(vis[t], t));
57 inq[t] = true;
58 have++;
59 }
60
61 for (int i = 0; i < N; i++) {
62 if (!inq[Ti[i]]) { //如果现在没有有这个模板,那么就要去借
63 have++;
64 ans++;
65 }
66 //把那个模板拿过来
67 inq[Ti[i]] = true;
68 q.push(make_pair(next[i], Ti[i]));
69
70 if (have>M) { //需要丢弃模板
71 PII x = q.top(); q.pop();
72 inq[x.second] = false;
73 have--;
74 }
75 }
76
77 printf("%d\n", ans);
78 }
79
80 int main() {
81 #ifdef Phantom01
82 freopen("I.txt", "r", stdin);
83 #endif //Phantom01
84
85 while (scanf("%d%d", &N, &M)!=EOF) {
86 input();
87 solve();
88 }
89
90 return 0;
91 }

时间: 2024-10-28 01:59:31

HDU 4398 Template Library Management的相关文章

C++ Standard Template Library STL(undone)

目录 1. C++标准模版库(Standard Template Library STL) 2. C++ STL容器 3. C++ STL 顺序性容器 4. C++ STL 关联式容器 5. C++ STL 容器适配器 6. C++ STL算法 7. C++ STL边界限制 1. C++标准模版库(STL) STL就是Standard Template Library,标准模板库.从根本上说 1. STL是一些"容器"集合 2. STL也是算法和其他一些组件的集合 3. 这里的&quo

图文安装Windows Template Library - WTL Version 9.0

从http://wtl.sourceforge.net/下载 WTL 9.0,或者点此链接下载:WTL90_4140_Final.zip,然后解压到你的VC目录下面, 我的地址是:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\WTL,你可以换成你的vc目录地址 解压后的目录结构如下: 然后打开 APPWiz目录,双击setup.js 然后一路OK就可以了. 接着就可以在VS里面直接用向导方式新建WTL项目了,编译报错:找不到文件at

django升级2.1python升级3.7时出现的错误:&quot;trying to load &#39;%s&#39;: %s&quot; % (entry[1], e) django.template.library.InvalidTemplateLibrary:

django升级2.1python升级3.7时出现如下的错误: "trying to load '%s': %s" % (entry[1], e) django.template.library.InvalidTemplateLibrary: Invalid template library specified. ImportError raised when trying to load 'crispy_forms.templatetags.crispy_forms_utils':

C++标准模板库Stand Template Library(STL)简介与STL string类

参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进行过学习和总结,但并没有一个宏观上的把握,现在通过上一篇和这一篇博文,将对C++模板以及基于C++模板的STL关联起来,形成一个总体的把握,对于掌握C++中模板(template)这一强有力的工具会十分有帮助.本文的主要内容有: (1) STL容器: (2) STL迭代器: (3) STL算法: (4) ST

【HDOJ】1497 Simple Library Management System

链表. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 #define MAXM 1001 6 #define MAXN 100001 7 8 int un[MAXM], ub[MAXM]; 9 int v[MAXN]; 10 int next[MAXN]; 11 12 int comp(const void *a, const void *b) { 13 return *(int *)

[c++] STL = Standard Template Library

How many people give up, because of YOU. Continue... 先实践,最后需要总结. 1. 数据流中的数据按照一定的格式<T>提取 -------> 放在vector中. 2. 注意 vector.begin(), vector.front()的区别. 3. accumulate()求sum.(与valarrary貌似有一拼,孰优孰劣?---- 可能后者效率更高) 4. multiplies<int>()   c++ -->

(HDU)1064 --Financial Management( 财务管理)

题目链接:http://vjudge.net/problem/HDU-1064 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int main() 7 { 8 int i; 9 double a,sum=0.0; 10 for(i=1;i<=12;i++) 11 { 12 scanf("%lf",&a);

C++中Standard Template Library(STL)入门简要概况

STL在C++中算是相当简洁方便的东西了,但不知为何网上的教程都非常难,给新手入门造成了非常多的困扰.在此写篇新手入门教程.阅读此文需要有一定的C/C++基础,比如你要会用C语言的数组.链表等,会用C++类并且有一定了解等等,不会的还是别看了,就算你会用STL你也会发现有各种各样的bug. 本篇只介绍STL最基础的部分,其他的调用方式等等都差不多了.本篇不会讲解太多,具体需要自己去研究进入正题 (1) vector 很神奇的一个词汇,翻译成汉语是"向量",其实,这就是一个C++类,用于

STL(Standard Template Library)

容器(Containers) list.deque.vector.map等  算法(Algorithms)  算法作用于容器,它们提供了执行各种操作的方式.包括了对容器的初始化.排序.搜索和转化等操作  迭代器(iterators)  用于遍历元素,这些集合可能是容器也可能是容器的子集 仿函数(Function object) 仿函数又称函数对象,其实就是重载了()的struct 迭代适配器(Adaptor)   空间配置器(Allocator) 作用:1.对象的创建于销毁 2.内存的获取与释放