`
yuanlanxiaup
  • 浏览: 896136 次
文章分类
社区版块
存档分类
最新评论

POJ 1033 磁盘文件碎片整理 模拟题 栈应用

 
阅读更多

以后一定要细心,不能再犯这个低级的错误,把WA控制在最低范围内

参考了http://www.cnblogs.com/damacheng/archive/2010/09/24/1833983.html的题目分析

题目大意:你要写一个OS,要实现磁盘碎片整理的功能。磁盘分为N个簇,一个文件可以占用K个簇,(1 <= K < N <= 10000),给出各个文件的占用磁盘的情况,也就是一个文件占用了哪些簇,想要进行碎片整理,就是把这些簇按顺序整理到磁盘的最顶部,例如给出示例:

  文件1:2 3 11 12,占用了4个簇,编号为1-4。
  文件2:7,占用了1个簇,编号为5。

  文件3:18 5 10,占用了3个簇,编号为6-8。

  初始状态是这样的,0表示未占用:

  簇号:  1 2 3 4 5 6 7 8 910 11 12 13 14 15 16 17 18

  逻辑编号:0 1 2 07 0 5 00 8 34 00 0 0 0 6

  一共整理到最后,磁盘的情况最后是这样的:

  簇号:  1 2 3 4 5 6 7 8 910 11 12 13 14 15 16 17 18

  逻辑编号:1234567800000 0 0 000

  写一个程序得到整理好碎片最少需要多少步操作,并把这些操作打印出来。比如说第1个簇的内容放到第2个簇,打印出1 2。操作的定义是这样的:把一个簇的内容放到另个一个簇中,算是一步操作。

  注意这里是Special Judge,意思是只要答案符合要求就行了,不必和SAMPLE中的OUTPUT一样也可以AC。

  怎么才能找到最少的步数呢?我想了半天也没怎么想出来,于是看了看DISCUSS,总结以下:

  遍历整个磁盘,设i为当前遍历的簇的编号,clusters为整个磁盘,clusters[i]表示第i个簇是否被占用,被哪个编号的文件片段占据。

  (1) 如果clusters[i]为0,也就是未被使用,不进行处理。

  (2) 如果clusters[i]为i,也就是已经到了整理好的状态,不进行处理。

  (3) 如果clusters[i]不满足1和2,则又有两种情况。

    情况一:磁盘使用情况成链:如图所示:

    簇号:  1 2 3 4 5 6...    

    逻辑编号:5 04230 ...

    第1个簇被第5个文件片断占据,第5个簇又被第3个文件片段占据,第3个簇又被第4个文件片段占据,第4个簇又被第2个文件片断占据,第2个簇未被占据。算法就很简单了,按照簇被访问的反方向:

    clusters[2] = clusters[4],clusters[4] = clusters[3],clusters[3] = clusters[5],

    clusters[5] = clusters[1],最后clusters[1] = 0。怎么样反方向呢,使用一个栈就好了。

    情况二:磁盘使用情况成环:如图所示:

    簇号:  1 2 3 4 5 6...    

    逻辑编号:514230 ...

    这种情况跟情况一差不多,只是最后clusters[2]指向了第1个簇,这样就形成了一个环,这里只是需要额外处理一下,就像交换2个变量一样,先在从磁盘末尾找到1个空的簇,因为题目保证至少有一个空的簇,先把clusters[2]放到这个空的簇中,然后再执行情况1中的操作,最后再把空的簇的值赋给clusters[1]就好了。最后注意一点,如果操作次数为0,则需要输出一行信息。


Source Code

Problem: 1033 User: yangliuACMer
Memory: 420K Time: 704MS
Language: C++ Result: Accepted




分享到:
评论

相关推荐

    POJ 分类题目 txt文件

    从给定的文件信息来看,这是一份关于POJ(Pat Online Judge)平台上的编程题目的分类汇总。POJ是北京大学设立的一个在线编程评测系统,提供了大量的编程题目供学习者练习,涵盖了各种算法和数据结构知识。下面将对这...

    poj2775.rar_poj_poj 27_poj27_poj2775

    标题中的"poj2775.rar"是一个与编程竞赛相关的压缩文件,通常在这样的竞赛中,参赛者需要解决特定的编程问题。"poj"是"Programming Online Judge"的缩写,它是一个在线编程练习平台,允许用户提交代码并进行自动测试...

    poj acm300题 c++源码打包

    标题中的“poj acm300题 c++源码打包”表明这是一份包含300个在POJ(编程在线判题系统)上已通过的ACM竞赛题目解决方案的压缩文件,语言为C++。ACM,即国际大学生程序设计竞赛(International Collegiate ...

    poj.rar_poj

    标题中的"poj.rar_poj"暗示了这是一个与POJ(Programming Online Judge)相关的压缩文件,POJ是一个在线编程竞赛平台,主要供程序员们练习和提交算法解决方案。在这个压缩包中,很可能包含了用户在POJ上参与编程挑战...

    poj训练计划.doc

    - 复杂的模拟题:如`poj3393, poj1472`。 - **图算法** - 差分约束系统:如`poj1201, poj2983`。 - 最小费用最大流:如`poj2516, poj2195`。 - **数据结构** - 线段树:如`poj2528, poj2828`。 - RMQ(区间...

    poj题目分类

    * 较为复杂的模拟题的训练:例如 poj3393、poj1472、poj3371、poj1027、poj2706。 2. 图算法: * 差分约束系统的建立和求解:例如 poj1201、poj2983。 * 最小费用最大流:例如 poj2516、poj2516、poj2195。 * ...

    POJ算法题目分类

    * 模拟法:模拟法是指通过模拟问题的过程来解决问题的方法,如 poj1068、poj2632、poj1573、poj2993、poj2996。 二、图算法 图算法是指解决图相关问题的算法,包括图的深度优先遍历和广度优先遍历、最短路径算法...

    poj习题答案

    【压缩包子文件的文件名称列表】:poj练习2、poj练习 这两个文件名可能代表了两个不同的POJ习题解答集合。"poj练习2"可能是第二组或第二部分的解答,而"poj练习"可能是更综合或者第一部分的习题解答。它们可能包含...

    acm训练计划(poj的题)

    - (poj1860, poj3259, poj1062, poj2253, poj1125, poj2240):介绍迪杰斯特拉算法(Dijkstra)、贝尔曼-福特算法(Bellman-Ford)、弗洛伊德算法(Floyd)等。 - 使用堆优化的迪杰斯特拉算法。 3. **最小生成树...

    大顶堆应用:POJ2010

    标题“大顶堆应用:POJ2010”指的是一个关于大顶堆算法在解决实际问题中的应用,特别是针对编程竞赛网站POJ(Programming Online Judge)上的问题2010。大顶堆是一种特殊的完全二叉树,其每个节点的值都大于或等于其...

    POJ是在线测评系统这里有一些经典试题。跳蚤是一道经典试题代码给出了Accepted算法.zip

    "跳蚤"是该平台上的一道经典试题,可能涉及到动态规划、数学或者模拟等算法问题。 描述中的信息与标题基本一致,强调了"跳蚤"这道题目以及包含的"Accepted"算法,意味着提供的代码已经成功通过了POJ系统的测试用例...

    POJ.rar_poj java_poj1048

    【压缩包子文件的文件名称列表】"POJ" 暗示这个压缩包可能包含了源代码文件,可能是参赛者的解决方案或者题目的示例输入/输出文件。 约瑟夫环问题的解决方案通常使用链表或者循环数组来模拟圈子,用一个计数器来...

    POJ1017-Packets

    标题中的"POJ1017-Packets"指的是北京大学在线编程平台POJ(Problem Set of Peking University)上的第1017题,这是一道关于数据包处理的问题。题目通常要求参赛者编写程序来解决特定的算法或逻辑挑战。 在描述中...

    POJ1010-STAMPS

    【标题】"POJ1010-STAMPS"是一个编程题目,来源于北京大学的在线判题系统POJ(Problem Set of Peking University),这是一处训练程序员算法技能和编程能力的平台。该题目旨在考察参赛者对动态规划或贪心算法的理解...

    ACM-POJ 算法训练指南

    根据给定的文件信息,以下是对“ACM-POJ算法训练指南”的详细解析与相关知识点的归纳: ### 一、基本算法 1. **排序**:包括了基础的排序算法,如快速排序(poj1753, poj2965),是算法学习的基础。 2. **搜索**:...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

    POJ1837-Balance

    【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    poj推荐50题

    - **1011** 和 **1033** 两题适合初步了解搜索算法的应用场景。 - **1129** 和 **2049** 可以帮助进一步加深对搜索的理解。 - **2056** 和 **2488** 这两个题目则提供了不同的挑战,特别是 **2492** 还提供了一个...

    POJ1850-Code

    【标题】"POJ1850-Code"是一个关于北京大学在线编程平台POJ(Problem Online Judge)上的一道题目1850的解题报告和解决方案。这道题目涉及了算法设计和编程实践,是计算机科学教育中常见的训练方式,旨在提升学生的...

Global site tag (gtag.js) - Google Analytics