POJ1033 Defragment

题目来源:http://poj.org/problem?id=1033

题目大意:

  某操作系统的文件系统中,所有的磁盘空间被分为N个大小相等的cluster,编号1至N。每个文件占用一个或多个cluster。所有没有被文件占用的cluster称为是空闲的。磁盘上的一个文件如果放置在连续的cluster上,读取速度是最快的。

  磁盘以匀速旋转,磁头找到某一个cluster的时间的不等的。因此,找到靠近开头的cluster更快。所有的文件被事先按访问频率高到低编号1到K,最好的文件放置方式是:文件1放置于cluster 1,2,...S1,文件2放置于cluster S1+1, S1+2,...S1+S2.后面类似,紧挨着放置。Si表示第i个文件占据的cluster数。

  为了将磁盘上的文件整理成上述的最优放置方式,需要对cluster进行移动。一次移动包括将一个cluster的内容读出来,写至一块空闲的cluster上,完成后之前的那块cluster变为空闲。

  程序的目标是将磁盘上的文件变为最优放置方式需要的最少移动次数和移动次序。

输入:第一行含两个整数N和K分别代表cluster数和文件数。接下来K行,每行代表一个文件,第一个数字代表该文件含多少cluster,后面的每个数字代表所占的cluster的编号。

输出:按顺序输出表示移动的数据对Pj,Qj。表示将Pj号cluster的数据移动到Qj.(答案可能不唯一,采用了Special Judge,只要答案正确即可)不需要移动则输出"No optimization needed".


Sample Input

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

Sample Output

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

实际上可以把问题看过一个数组的重新排列问题.用clusters[N]数组表示第i块cluster处放置的文件块的序号(块的序号按重排后结果编排,即该块最终应该位于哪一个cluster)。那么重排后的结果应该是前面部分的clusters[i]=i,后面的部分clusters[i]=0.

比如sample中的例子:

初始状态:

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

clusters[i]:  0  1  2  0  7  0  5  0  0   8    3    4    0    0   0    0    0    6 

 

重排后:

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

clusters[i]:  1  2  3  4  5  5  6  8  0   0    0    0    0    0   0    0    0    0 

遍历所有的cluster,会有以下几种情况:

1. clusters[i]=0,不必处理。

2. clusters[i]=1,不必处理。

3. 不是以上两种情况,则需要移动cluster。此时又有两种情况:

  a.需要移动的cluster形成链,例如:

     i:   1  2  3  4  5  6     

   clusters[i]: 5  0  4  2  3  0 

   1被5占,5被3占,3被4占,4被2占,2为空。用栈保存占用关系,借助一个空位,逆向移动即可。

  b.需要移动的cluster形成环,例如:  

      i:  1  2  3  4  5  6     

    clusters: 5  1  4  2  3  0 

  1被5占,5被3占,3被4占,4被2占,2又被1占。这种情况从磁盘末尾开始找一个空cluster(题目保证了一个至少有一个空的cluster,否则就移动不了了),借助这个空的cluster,然后逆向移动。

  遍历完成时磁盘整理也完成了。

 1 //
 2 //        POJ1033 Defragment
 3 //        Memory: 408K        Time: 829MS
 4 //        Language: C++        Result: Accepted
 5 //
 6 
 7 #include <iostream>
 8 #include <stack>
 9 
10 using namespace std;
11 
12 int main() {
13     int N;
14     int K;
15     int move_cnt = 0;
16     cin >> N >> K;
17 
18     int * clusters = new int[N + 1];
19     for (int i = 0; i <= N; ++i) {
20         clusters[i] = 0;
21     }
22     int sum = 0;
23     for (int i = 0; i < K; ++i) {
24         int n;
25         cin >> n;
26         for (int j = 1; j <= n; ++j) {
27             int a;
28             cin >> a;
29             clusters[a] = ++sum;
30         }
31     }
32     for (int i = 1; i <= N; ++i) {
33         if (clusters[i] == 0 || clusters[i] == i) {
34             continue;
35         }
36         stack<int> s;
37         int next = clusters[i];
38         s.push(i);
39         bool isCircle = false;
40         while (true) {
41             if (clusters[next] == i) {
42                 isCircle = true;
43                 break;
44             } else if (clusters[next] == 0) {
45                 break;
46             }
47             s.push(next);
48             next = clusters[next];
49         }
50         if (isCircle == true) {
51             int j = N;
52             while (clusters[j] != 0) {
53                 --j;
54                 continue;
55             }
56             cout << next << " " << j << endl;
57             clusters[j] = clusters[next];
58             int t;
59             while (!s.empty()) {
60                 t = s.top();
61                 cout << t << " " << next << endl;
62                 clusters[next] = clusters[t];
63                 next = t;
64                 s.pop();
65                 ++move_cnt;
66             }
67             clusters[next] = clusters[j];
68             clusters[j] = 0;
69             cout << j << " " << next << endl;
70         } else {
71             int t;
72             while (!s.empty()) {
73                 t = s.top();
74                 cout << t << " " << next << endl;
75                 clusters[next] = clusters[t];
76                 next = t;
77                 s.pop();
78                 ++move_cnt;
79             }
80             clusters[next] = 0;
81         }
82     }
83     if (move_cnt == 0) {
84         cout << "No optimization needed" << endl;
85     }
86     system("pause");
87     return 0;
88 }
View Code

转载于:https://www.cnblogs.com/dengeven/p/3230223.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php怎么和数据库通信,php – 如何处理域和数据库层之间的通信?

加布里埃尔,这被称为“impedance matching problem”.有许多解决方案,从重量级的实体bean,如J2EE实体bean到Ruby ActiveRecord,再到简单的手工连接编码.更新好吧,很难在没有更多信息的情况下很难确切地知道如何攻击它,但这是基本的方法.任何这些架构问题都是由性能等非功能性需…

pcb过孔漏铜_【企业资讯】大正瑞地:专注PCB药水二十年,品质、性能可靠

企业简介公司拥有领先的技术及产品、顾问型服务、PCB药水全系列体系化运行。沉铜、电镀、中/超粗化、减铜药水、化镍金、OSP、显影、退膜及辅助物料等全系列PCB药水&#xff0c;自主研发&#xff0c;拥有核心技术&#xff0c;自成体系&#xff0c;可以全面、系统的供应产品及全…

asterisk extconfig.conf文件解析

1. int read_config_maps(void), 定义在main/config.c,被main函数调用&#xff0c;下面开始分析read_config_maps struct ast_config *config, *configtmp; 新建一个配置结构体 configtmp ast_config_new(); 从extconfig_conf即extconfig.conf得到配置信息并存储在config 中…

php微信模板信息发送的代码例子,微信模板消息发送样例

微信模板消息发送样例://先构建一个http发送function http_request($url, $data array()){$ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_S…

前端切换视图_前端架构 101(五):从 Flux 进化到 Model-View-Presenter

李熠&#xff1a;前端架构 101&#xff08;一&#xff09;&#xff1a;在谈论它们之前我们需要达成的共识​zhuanlan.zhihu.com李熠&#xff1a;前端架构 101&#xff08;二&#xff09;&#xff1a; MVC 初探​zhuanlan.zhihu.com李熠&#xff1a;前端架构 101&#xff08;三&…

[转+整理]十道海量数据处理面试题与十个方法大总结

海量数据处理&#xff1a;十道面试题与十个海量数据处理方法总结 作者&#xff1a;July、youwang、yanxionglu。 时间&#xff1a;二零一一年三月二十六日 本文之总结&#xff1a;教你如何迅速秒杀掉&#xff1a;99%的海量数据处理面试题。有任何问题&#xff0c;欢迎随时交流、…

java fx 建立窗体,3花式窗体与JavaFX CSS

2019独角兽企业重金招聘Python工程师标准>>>3花式窗体与JavaFX CSS本教程是通过添加级联样式表(CSS)来使您的JavaFX应用程序看起来很有吸引力。您开发设计&#xff0c;创建.css文件并应用新样式。在本教程中&#xff0c;您将使用一个使用默认样式进行标签&#xff0c;…

asterisk几个通用函数说明

1. #define ast_config_load(filename, flags) ast_config_load2(filename, AST_MODULE, flags) 加载配置文件filename&#xff0c;并返回一个ast_config结构体指针。 ast_config_load2是调用了 struct ast_config *ast_config_internal_load(const char *filename, struc…

python如何进行格式化输出变量_Python变量格式化输出实现原理解析

print() 函数使用以 % 开头的转换说明符对各种类型的数据进行格式化输出。转换说明符(Conversion Specifier)只是一个占位符(也称为格式化操作符)&#xff0c;它会被后面表达式(变量、常量、数字、字符串、加减乘除等各种形式)的值代替。转换说明符解释%d、%i转换为带符号的十进…

java json 返回null,[] Spring4 MVC 返回json格式时候 设置不返回null值属性的有关问题...

[求助] Spring4 MVC 返回json格式时候 设置不返回null值属性的问题本帖最后由 bighong0404 于 2015-10-06 12:45:38 编辑背景:使用responseBody设置以json格式返回数据时候. 有时候被返回的对象有些属性是null值, 默认还是会输出. 例如下面代码. 在与移动端交互时候会很浪费流量…

log4j无厘头异常

今天系统升级&#xff0c;是web程序&#xff0c;备份程序之后&#xff0c;替换class下面的com的全部类文件后shutdown tomcat&#xff0c;然后启动程序&#xff0c;startup之后出现 java.lang.NullPointerException at org.apache.log4j.spi.LocationInfo.<init>(Loca…

res_config_mysql和chan_sip模块的加载分析

1. res_config_mysql的模块加载早于chan_sip&#xff0c;他们的加载函数均为load_module 先分析res_config_mysql的load_module函数 parse_config(0); parse_config解析res_config_mysql文件&#xff0c;并用文件中的配置信息填充mysql_conn结构体 我当前的res_config_mysql文件…

如何连接安卓手机_安卓手机如何使用AirPods

苹果公司推出的无线蓝牙耳机AirPods可以说是市面上最好的无线耳机&#xff0c;配合iPhone使用能够给你带来畅快舒适的体验。有很多小米华为oppo&#xff0c;vivo等安卓手机用户也在问了&#xff0c;安卓手机能够支持AirPods呢&#xff0c;答案是肯定的。图片来源&#xff1a;网…

晒一下我的代码生成器

经过最近一段新的尝试【BS架构】,之前的编程一直是CS架构&#xff0c;但也总是在忙那些项目&#xff0c;没法整理出一套符合自己团队的一套编程体系和架构&#xff1b; 新的起点&#xff0c;又是一个新的挑战&#xff0c;现在已经是03年&#xff0c;最早做的时候是07年&a…

discuz viewthread.php,修改discuz论坛的标题header和footer

1、关于去掉DZ论坛标题处的Powered by Discuz!&#xff0c;去掉他的原因是为了使标题更加简洁明了&#xff0c;还有就是不被搜索到导致SPAM&#xff1a;具体的修改方法&#xff1a;打开/templates/default/header.htm&#xff0c;在第五行中直接删除&#xff1a;- Powered by D…

sed命令详解

转载&#xff1a;http://blog.chinaunix.net/u/22677/showart_1076318.html1.简介sed是非交互式的编辑器。它不会修改文件&#xff0c;除非使用shell重定向来保存结果。默认情况下&#xff0c;所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件&#xff08;或输入&#xff…

Oracle中的单值函数

Oracle的函数 Oracle函数可以分为单值函数和分组函数两大类&#xff0c;单值函数又分为字符函数、日期和时间函数、数字函数、转换函数和混合函数&#xff1a;分组函数右count、max、min、avg、sum&#xff0c;都可以和group by 搭配使用。 单值函数 1、 字符函数 l 字符串连…

asterisk账号和拨号方案mysql存储(静态)

asterisk账号和拨号方案的静态存储相对动态的话&#xff0c;比较简单&#xff0c;而且也比较好理解&#xff0c;说白了就是把 sip.conf和extensions.conf文件的内容完完整整的放入到数据库中&#xff0c;不像动态存储那样&#xff0c;不但需要数据库而且还需要 sip.conf和ext…

matlab自动排版,工具方法| Matlab 简单绘图与排版

matlab启动界面 来自百度百科对于很多教师与学生&#xff0c;Matlab是做数值计算很好的一款软件。收集、整理、分析数据十分的方便&#xff0c;我们也可以通过Matlab画出相对比较好看的图。这里简单总结下Matlab的画图方式与排版&#xff0c;供初学者参考、交流。Matlab基本都是…

坦克大战代码_坦克大战系列文章-坦克大战简介

前言本篇主要对坦克大战Robocode做一个简单的介绍&#xff0c;对java最初的人工智能算法演练工具做一个了解坦克大战简介今天我们要谈的是java 最初的基于人工智能算法的仿真模拟坦克大战&#xff0c;全称Robocode。Robocode 是一位IBM的工程师 Mat Nelson 用Java 语言所创造的…