QOJ.ac

QOJ

حد الوقت: 1 s حد الذاكرة: 128 MB مجموع النقاط: 100

#1933. 书籍替换

الإحصائيات

教授的作业明天就要截止了。为了完成任务,学生们必须在图书馆复印许多参考书的页面。

所有的参考书都存放在储藏室里,只有图书管理员可以进入。为了获得参考书某一页的复印件,学生需要请求图书管理员进行复印。图书管理员从储藏室取出书籍,并根据请求制作页面复印件。整体情况如图 1 所示。

图 1:图书馆

学生们在柜台前排队。一次只能请求一本书。如果一个学生还有更多的请求,该学生在请求被处理后会排到队伍的末尾。

在储藏室里,有 $m$ 个书桌 $D_1, \dots, D_m$ 和一个书架。它们按此顺序从门口到房间内部排列。每个书桌上最多可以放置 $c$ 本书。如果学生请求一本书,图书管理员会进入储藏室,按 $D_1, \dots, D_m$ 的顺序查找,最后查找书架。找到书后,图书管理员将其取出,并给学生提供页面复印件。

然后,图书管理员带着请求的书籍回到储藏室,并按照以下程序将其放置在 $D_1$ 上:

  • 如果 $D_1$ 未满(换句话说, $D_1$ 上的书籍数量 $< c$),图书管理员将请求的书籍放在那里。
  • 如果 $D_1$ 已满,图书管理员:
    • 将请求的书籍暂时放在离入口最近的非满书桌上,如果所有书桌都已满,则放在书架上;
    • 找到 $D_1$ 上最久未被请求的书籍(即最近最少使用书籍)并将其取出;
    • 将其放在离入口最近的非满书桌(除 $D_1$ 外)上,如果除 $D_1$ 外所有书桌都已满,则放在书架上;
    • 从临时存放处取回请求的书籍;
    • 最后将其放在 $D_1$ 上。

你的任务是编写一个程序,模拟学生和图书管理员的行为,并计算整个过程的总成本。成本与访问书桌或书架有关,即上述描述中在书桌或书架上放置/取走书籍的行为。访问书桌 $D_i$ 的成本为 $i$,访问书架的成本为 $m + 1$。也就是说,访问 $D_1, \dots, D_m$ 和书架的成本分别为 $1, \dots, m$ 和 $m + 1$。其他操作的成本忽略不计。

最初,书桌上没有书。图书馆开放后不会有新学生出现。

输入格式

输入包含多个数据集。输入的结束由一行包含三个空格分隔的零表示,该行不属于数据集。

每个数据集的格式如下:

$m \ c \ n$ $k_1$ $b_{11} \dots b_{1k_1}$ $.$ $.$ $.$ $k_n$ $b_{n1} \dots b_{nk_n}$

这里,所有数据项均为正整数。$m$ 是书桌的数量,不超过 10。$c$ 是允许放在书桌上的书籍数量,不超过 30。$n$ 是学生人数,不超过 100。$k_i$ 是第 $i$ 位学生请求的书籍数量,不超过 50。$b_{ij}$ 是第 $i$ 位学生在第 $j$ 轮请求的书籍 ID。没有两本书具有相同的 ID。注意,学生可能会多次请求同一本书。$b_{ij}$ 小于 100。

说明

在此处,我们展示上述数据集的成本计算示例:

$3 \ 1 \ 2$ $3$ $60 \ 61 \ 62$ $2$ $70 \ 60$

在这个数据集中,有 3 个书桌($D_1, D_2, D_3$)。每个书桌最多放 1 本书。学生人数为 2。第一位学生请求 3 本书,ID 分别为 60、61 和 62;第二位学生请求 2 本书,ID 分别为 70 和 60。

该数据集的成本计算如下:首先,对于第一位学生的第一个请求,图书管理员从书架上取出 60 号书并将其放在 $D_1$ 上,第一位学生排到队尾,成本为 5。接下来,对于第二位学生的第一个请求,图书管理员从书架上取出 70 号书,将其放在 $D_2$ 上,将 60 号书从 $D_1$ 移至 $D_3$,最后将 70 号书从 $D_2$ 移至 $D_1$,成本为 13。类似地,书籍 61、60 和 62 的成本分别计算为 14、12 和 14。因此,总成本为 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

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.