题目名称 1222. 磁盘碎片整理
输入输出 defrag.in/out
难度等级
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 10
题目来源 Gravatar王者自由 于2012-10-26加入
开放分组 全部用户
提交状态
分类标签
群论
分享题解
通过:3, 提交:10, 通过率:30%
Gravatardelta 100 0.071 s 0.67 MiB C++
Gravatarevd 100 0.081 s 1.05 MiB C++
Gravatarzhengtn03 100 0.145 s 1.31 MiB C++
Gravatardelta 60 0.085 s 0.66 MiB C++
Gravatarzhengtn03 60 0.143 s 1.46 MiB C++
Gravatarzhengtn03 60 0.149 s 1.46 MiB C++
Gravatardelta 50 0.076 s 0.67 MiB C++
Gravatarzhengtn03 10 0.145 s 1.46 MiB C++
Gravatardelta 0 0.075 s 0.67 MiB C++
Gravatarevd 0 10.000 s 1.05 MiB C++
关于 磁盘碎片整理 的近10条评论(全部评论)
看起来挺难,弄明白题意后就非常简单了。其实就是在找一个元素的最终位置,如果该位置上没有其它元素,直接移过去;如果有其它元素,再对其进行相同的操作,或者将其移动到不会被占用的内存块上,直到所有元素都到达自己最终的位置。
Gravatarevd
2015-02-05 15:34 1楼

1222. 磁盘碎片整理

★   输入文件:defrag.in   输出文件:defrag.out   简单对比
时间限制:1 s   内存限制:128 MiB

【问题描述】

出于最高安全性考虑,司令部采用了特殊的安全操作系统,该系统采用一个特殊的文件系统。在这个文件系统中所有磁盘空间都被分成了相同尺寸的N块,用整数1N标识。每个文件占用磁盘上任意区域的一块或多块存储区,未被文件占用的存储块被认为是可是用的。如果文件存储在磁盘上自然连续的存储块中,则能被以最快的速度读出。

因为磁盘是匀速转动的,所以存取上面不同的存储块需要的时间也不同。读取磁盘开头处的存储块比读取磁盘尾处的存储块快。根据以上现象,我们事先将文件按其存取频率的大小用整数1K标识。按文件在磁盘上的最佳存储方法,1号文件将占用1, 2, , S1的存储块,2号文件将占用S1+1, S1+2, …, S1+S2的存储块,以此类推(Si是被第i个文件占用的存储块的个数)。为了将文件以最佳形式存储在磁盘上,需要执行存储块移动操作。一个存储块移动操作包括从磁盘上读取一个被占用的存储块至内存并将它写入其他空的存储块,然后宣称前一个存储块被释放,后一个存储块被占用。

本程序的目的是通过执行最少次数的存储块移动操作,将文件安最佳方式存储到磁盘上,注意同一个文件的存储块在移动之后其相对次序不可改变。

【输入】

    每个磁盘说明的第一行包含两个用空格隔开的整数NK(1KN100000),接下来的K行每行说明一个文件,对第i个文件的说明是这样的:首先以整数Si开头,表示第i个文件的存储块数量,1<=Si<=N-K,然后跟Si个整数,每个整数之间用空格隔开,表示该文件按自然顺序在磁盘上占用的存储块的标识。所有这些数都介于1N之间,包括1N。一个磁盘说明中所有存储块的标识都是不同的,并且该盘至少有一个空的存储块。

【输出】

    对于每一个磁盘说明,只需输出一行句子“We need M move operations”,M表示将文件按最佳方式存储到磁盘上所需进行的最少存储块移动操作次数。如果文件已按最佳方式存储,仅需输出“No optimization needed.”。

【样例】

defrag.in                            defrag.out

20 3                                 We need 9 move operations

4 2 3 11 12

1 7

3 18 5 10