poj 1033 Defragment

题解转自: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  9  10  11  12  13  14  15  16  17  18

  逻辑编号:0  1  2  0  7  0  5  0  0   8   3   4   0   0   0   0   0   6

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

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

  逻辑编号:1  2  3  4  5  6  7  8  0   0   0   0   0   0   0   0   0   0

  写一个程序得到整理好碎片最少需要多少步操作,并把这些操作打印出来。比如说第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  0  4  2  3  0 ...

    第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 ...     

    逻辑编号:5  1  4  2  3  0 ...

    这种情况跟情况一差不多,只是最后clusters[2]指向了第1个簇,这样就形成了一个环,这里只是需要额外的

    处理一下,就像交换2个变量一样,先在从磁盘末尾找到1个空的簇,因为题目保证至少有一个空的簇,先把    

    clusters[2]放到这个空的簇中,然后再执行情况1中的操作,最后再把空的簇的值赋给clusters[1]就好了。

  最后注意一点,如果操作次数为0,则需要输出一行信息。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<string>
  6 #include<queue>
  7 #include<algorithm>
  8 #include<map>
  9 #include<iomanip>
 10 #include<climits>
 11 #include<string.h>
 12 #include<numeric>
 13 #include<cmath>
 14 #include<stdlib.h>
 15 #include<vector>
 16 #include<stack>
 17 #include<set>
 18 #define FOR(x, b, e)  for(int x=b;x<=(e);x++)
 19 #define REP(x, n)     for(int x=0;x<(n);x++)
 20 #define INF 1e7
 21 #define MAXN 100010
 22 #define maxn 1000010
 23 #define Mod 1000007
 24 #define N 1010
 25 using namespace std;
 26 typedef long long LL;
 27
 28 int n, m;
 29 int c[10010];
 30 int tmp;
 31 int k;
 32 int num;
 33
 34 void gao()
 35 {
 36     int next;
 37     num = 0;
 38     stack<int> s;
 39     for (int i = 1; i <= n; ++i) {
 40         if (c[i] == i || c[i] == 0) continue;
 41         s.push(i);
 42         next = c[i];
 43         bool is_circle = false;
 44         while (true) {
 45             if (c[next] == i) {    //比如3放5 5放3,形成了一个环
 46                 is_circle = true;
 47                 break;
 48             }
 49             else if (c[next] == 0) {
 50                 is_circle = false;
 51                 break;
 52             }
 53             s.push(next);
 54             next = c[next];
 55         }
 56         int j;
 57         if (is_circle == true) {
 58             for (j = n; j >= 1; --j)
 59                 if (c[j] == 0) break;
 60             printf("%d %d\n", next, j);
 61             c[j] = c[next];
 62             while (!s.empty()) {
 63                 int t = s.top();
 64                 s.pop();
 65                 printf("%d %d\n",t,next);
 66                 c[next] = c[t];
 67                 next = t;
 68                 num++;
 69             }
 70             c[next] = c[j];
 71             c[j] = 0;
 72             printf("%d %d\n", j, next);
 73         }
 74         else {
 75             while (!s.empty()) {
 76                 int t = s.top();
 77                 s.pop();
 78                 printf("%d %d\n", t, next);
 79                 c[next] = c[t];
 80                 next = t;
 81                 num++;
 82             }
 83             c[next] = 0;
 84         }
 85     }
 86     if (num == 0) puts("No optimization needed");
 87 }
 88
 89 int main()
 90 {
 91     int tt;
 92     cin >> n >> m;
 93         k = 1;
 94     for (int i = 0; i < m; ++i) {
 95         cin >> tmp;
 96         for (int i = 0; i < tmp; ++i) {
 97             cin >> tt;
 98             c[tt] = k++;
 99         }
100     }
101     gao();
102     return 0;
103 }
时间: 2024-08-26 19:05:37

poj 1033 Defragment的相关文章

poj 1033

http://poj.org/problem?id=1033 题意:对一个磁盘进行整理,所谓的整理就是把同一个文件的一些数据,按照次序依次的存放,问整理的时候,磁盘的替换的操作是哪一些 思路:首先如果输入的时候就像定义好,每个文件应该存放的位置,然后看看它本身的位置和存放的位置是否一致,一致则不需要进行操作,不一致在进行操作 1 #include <stdio.h> 2 #include <string.h> 3 4 5 int m,n; 6 bool mark[10005]; /

1033:Defragment 模拟

描述您正在参与“新一代”操作系统和NG文件系统的开发.在该文件系统中,所有磁盘空间被分成相等大小的N个簇,由1到N的整数编号.每个文件占据盘的任意区域中的一个或多个簇.未被文件占用的所有群集都被视为免费.如果文件的所有集群都以自然顺序位于连续的磁盘集群中,则可以以最快的方式从磁盘读取文件.以恒定速度旋转磁盘意味着访问其集群需要不同的时间量.因此,读取位于磁盘开头附近的簇比读取位于其末端附近的簇执行得更快.因此,所有文件都按照从1到K的整数按照访问频率下降的顺序编号.在文件在磁盘上的最佳放置下,文

POJ题目推荐(转载)

POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉.2.标记为A and B的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目.3.列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制.4.这里不少题目在BUPT ACM FTP上面都有代码,请大家合理利用资源.5.50个题目要求每个题目都要写总结,养成良好的习惯.6.这个列表的目的在于让大家对各个方面的算法有个了解,也许要求有些苛刻,教条,请大家谅

双向广搜 POJ 3126 Prime Path

POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted: 9153 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change th

POJ 3126 Prime Path (BFS)

[题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.bfs+queue,分别枚举个十百千的每一位就能够了,只是注意个位仅仅能为奇数,且千位从1開始 代码: #ifndef _GLIBCXX_NO_ASSERT #include <cassert> #endif #include <cctype> #include <cerrno&g

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

POJ 3126 Prime Path(素数路径)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

F - Prime Path POJ 3126 筛选素数+bfs

F - Prime Path Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3126 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have t

【POJ 1195】 Mobile phones (树状数组)

[POJ 1195] Mobile phones (树状数组) Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 16761   Accepted: 7713 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The ar