1033:Defragment 模拟

描述
您正在参与“新一代”操作系统和NG文件系统的开发。在该文件系统中,所有磁盘空间被分成相等大小的N个簇,由1到N的整数编号。每个文件占据盘的任意区域中的一个或多个簇。未被文件占用的所有群集都被视为免费。如果文件的所有集群都以自然顺序位于连续的磁盘集群中,则可以以最快的方式从磁盘读取文件。
以恒定速度旋转磁盘意味着访问其集群需要不同的时间量。因此,读取位于磁盘开头附近的簇比读取位于其末端附近的簇执行得更快。因此,所有文件都按照从1到K的整数按照访问频率下降的顺序编号。在文件在磁盘上的最佳放置下,文件号1将占据集群1,2,...,S1,文件号2将占用集群S1 + 1,S1 + 2,...,S1 + S2和等等(这里Si是第i个文件占用的簇数)。
为了以最佳方式将文件放在磁盘上,执行集群移动操作。一个群集移动操作包括从磁盘读取一个占用的群集到内存并将其内容写入一些空闲群集。在那之后,第一个被宣布自由,第二个被宣布为被占领。
您的目标是通过执行尽可能少的群集移动操作,以最佳方式将文件放在磁盘上。
输入
输入文件的第一行包含两个由空格分隔的整数N和K(1 <= K <N <= 10000)。然后,K行跟随,每个都描述一个文件。第i个文件的描述以整数Si开始,该整数Si表示第i个文件中的簇数(1 <= Si <N)。然后,Si整数按空格分隔,以自然顺序指示磁盘上此文件的簇编号。
输入文件中的所有群集编号都不同,磁盘上始终至少有一个空闲群集。
输出
您的程序应该向输出文件写入以最佳方式将文件放在磁盘上所需的任何群集移动操作序列。由单个空格分隔的两个整数Pj和Qj应代表每个簇移动操作。 Pj给出了数据应该移动的簇号,而Qj给出了该数据应该移动到的簇号。
执行的集群移动操作的数量应尽可能小。如果磁盘上的文件已经以最佳方式放置,则输出应仅包含字符串“无需优化”。

样例输入

20 3
4 2 3 11 12
1 7
3 18 5 10

样例输出

2 1
3 2
11 3
12 4
18 6
10 8
5 20
7 5
20 7
#include <iostream>
#include <stack>
using namespace std;

#define N 10000

int main() {
    int a[N] = {0};
    int b[N] = {0};
    int c[N] = {0};
    int n;
    int k;
    cin >> n;
    cin >> k;
    int m = 1;
    for (int i=1; i <=k; i++) {
        int s;
        cin >> s;
        for (int j=1; j <=s; j++) {
            int tmp;
            cin >> tmp;
            a[tmp] = m;
            b[m] = tmp;
            m++;
        }
    }

    stack<int> Q;

    bool needed = false;

    for (int i=1; i<m; i++) {
        int t = i;
        while(a[t]!=t) {
            needed = true;
            if (c[t] == 1)  {
                for (int j =n; j>0; j--) {
                    if (a[j] == 0) {
                        cout << b[Q.top()] << " " << j << endl;
                        b[Q.top()] = j;
                        a[j] = Q.top();
                        Q.pop();
                        break;
                    }
                }
                break;
            }
            Q.push(t);
            if (a[t]==0) {
                break;
             }
            else {
                c[t] = 1;
                t = a[t];
            }
        }
        while(!Q.empty()) {
            int top = Q.top();
            Q.pop();
            cout << b[top] << " " << top << endl;
            a[top]= top;
            a[b[top]] = 0;
            b[top] = top;
        }
        for (int j =0; j < N; j++) {
            c[j] = 0;
        }
    }

    if (!needed){
        cout << "No optimization needed" << endl;
    }

}

来源:https://www.xuebuyuan.com/zh-hant/828723.html

原文地址:https://www.cnblogs.com/sweet-ginger-candy/p/11518218.html

时间: 2024-10-12 02:50:12

1033:Defragment 模拟的相关文章

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个簇,编

完全模拟FIFA2014世界杯 原创求顶!

还沉浸在2014世界杯吗? 快用程序模拟属于自己独一无二的世界杯吧! FIFA2014世界杯模拟器 你值得拥有 // 类 player. team的定义及实现, 代码放到 player_team.cpp 中 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 class player { 5 public: 6 player(); 7 player(int number, string name, s

【BZOJ 1033】 [ZJOI2008]杀蚂蚁antbuster

1033: [ZJOI2008]杀蚂蚁antbuster Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 583  Solved: 230 [Submit][Status] Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任务,就是用原始资金以及杀蚂蚁获得的奖金造防御塔,杀掉这些试图跟你抢蛋糕的蚂蚁

BZOJ 1033 杀蚂蚁

Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任务,就是用原始资金以及杀蚂蚁获得的奖金造防御塔,杀掉这些试图跟你抢蛋糕的蚂蚁~ 下附一张游戏截图: 为了拿到尽可能高的分数,佳佳设计了很多种造塔的方案,但在尝试了其中的一小部分后,佳佳发现,这个游戏实在是太费时间了.为了节省时间,佳佳决定写个程序,对于每一种方案,模拟游戏进程,根据效果来判断方案的优

C++编程实现对工厂产品生产流程的模拟

花费二个多月的时间编写了可以实时模拟工厂产品生产流程的程序,工厂产品生产流程的模拟,就是计算在工艺文件所规定的工序下,不同种类的多件产品(同一类别的产品可以有多件)在不同类别的多台设备(同一类别的设备可以有多台)上全部生产完毕所需的总时间.每一件产品可以在生产流程中先后多次在同一类设备上生产而且生产时间可以不同,某一给定时刻多件产品有可能需要在同一台设备上生产,造成设备占用冲突,这时必须按一定的算法对造成冲突的产品在设备等待队列上按优先级排队.产品在设备上加工完毕准备进入下一台设备生产时有同类型

CentOS系统启动及内核大破坏模拟实验

讲过了centos的启动流程,此时是不是想来点破坏呢?那就尽情的玩耍吧,记得在实验之前拍个快照,万一哪个环节错误恢复不回来了呢,毕竟数据无价,话不多说,开始. 一.删除伪系统根.(ramdisk文件) (1)模拟误操作删除ramdisk文件. ①模拟误删除initramfs-3.10.0-514.el7.x86_64.img文件. ②为当前正在使用的内核重新制作ramdisk文件 格式为:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) (

NYOJ 2356: 哈希计划【模拟】

题目描述 众所周知,LLM的算法之所以菜,就是因为成天打游戏,最近LLM突然想玩<金庸群侠传X>,结果进去后各种被虐,LLM就开始研究这个游戏的代码,顺便还学会了一点点点点lua语言,然后就开始了伟大的改游戏代码之旅,然后LLM发现自己too young了,这个游戏把所有的文本都进行了哈希,如果自己改了代码或者剧情文本的话它哈希出来的值就会和原来的哈希值不一样......然后游戏就会打不开.....,现在LLM发现了文本的哈希函数,要求你写个程序,功能为: 输入一段字符串,输出一个哈希值 为了

爬虫——模拟点击动态页面

动态页面的模拟点击: 以斗鱼直播为例:http://www.douyu.com/directory/all 爬取每页的房间名.直播类型.主播名称.在线人数等数据,然后模拟点击下一页,继续爬取 #!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' """ 动态页面的模拟点击: 模拟点击斗鱼直播:http://www.douyu.com/directory/all 爬取每页房间名.直播类型.主播名称.在线人数

爬虫——网站模拟登录

使用Selenium与PhantomJS模拟登录豆瓣:https://www.douban.com/ #!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' """ 模拟登录豆瓣:https://www.douban.com/ """ from selenium import webdriver # 调用环境变量指定的PhantomJS浏览器创建浏览器对象,executable