#P2740. Book Replacement
Book Replacement
描述
Hachioji的作业截止日期是明天。为了完成任务,学生们必须在图书馆复印许多参考书的页面。
所有参考书都放在一个储藏室里,只有图书管理员可以进入。要获得某本参考书的页面复印件,学生应向图书管理员提出请求。图书管理员会将书从储藏室取出,并根据请求复印页面。整体情形如图 1 所示。
学生在柜台前排队。一次只能请求一本书。如果某名学生还有其他请求,该学生在请求完成后会重新排到队尾。
在储藏室中,有 张桌子 和一个书架。它们按从门口到房间后部的顺序排列。每张桌子最多可放 本书。当学生请求某本书时,图书管理员按 的顺序在桌子上寻找,然后再到书架上寻找。找到后,取出该书并交给学生复印页面。
之后,图书管理员带着该书返回储藏室,根据以下流程将其放回 :
-
如果 未满(即 ),则将请求的书直接放到 ;
-
如果 已满,则:
- 将请求的书临时放到离门口最近的未满桌子,若所有桌子都已满,则放到书架;
- 找出 中最久未被请求的那本书(即最近最少使用的书),取出;
- 将该书放到离门口最近的未满桌子(不包括 ),若其他桌子都已满,则放到书架;
- 从临时位置取回请求的书;
- 最后将请求的书放回 。
你的任务是编写程序模拟学生和图书管理员的行为,并计算整个过程的总开销。访问每张桌子或书架(放入或取出书)的开销分别为:对 $D_i$ 的访问开销为 $i$,对书架的访问开销为 $m+1$。其他操作的开销可忽略。
初始时,所有桌子上均无书。图书馆开放后,不会有新的学生出现。
输入
输入包含多组数据。以一行 0 0 0
表示输入结束(该行不作为数据集)。
每组数据格式如下:
m c n
k1
b11 b12 … b1k1
…
kn
bn1 bn2 … bnkn
- 所有数据项均为正整数。
- (桌子数)≤ 10;(每桌最大书数)≤ 30;(学生数)≤ 100;
- (第 名学生的请求数)≤ 50;
- (第 名学生第 次请求的书 ID)< 100;不同书 ID 互不相同;学生也可能重复请求同一本书。
例如,数据集:
3 1 2
3
60 61 62
2
70 60
中,。第一名学生依次请求书 60、61、62;第二名学生依次请求 70、60。 该数据集的开销计算如下:
- 第1名学生第1次请求,管理员从书架取 60 并放到 ,开销 ;
- 第2名学生第1次请求,管理员取 70 放到 ,再将 60 从 移到 ,再将 70 从 移到 ,开销 ; …依次类推,总开销为 58。
输出
对于每组输入数据,输出该组请求处理的总开销。每组输出占一行。
输入数据 1
2 1 1
1
50
2 1 2
1
50
1
60
2 1 2
2
60 61
1
70
4 2 3
3
60 61 62
1
70
2
80 81
3 1 2
3
60 61 62
2
70 60
1 2 5
2
87 95
3
96 71 35
2
68 2
3
3 18 93
2
57 2
2 2 1
5
1 2 1 3 1
0 0 0
输出数据 1
4
16
28
68
58
98
23
来源
Japan 2005