POJ 1033 / Northeastern Europe 1998 Defragment (模拟&队列)
来源:互联网 发布:淘宝卖家服务助手 编辑:程序博客网 时间:2024/04/19 18:05
Defragment
http://poj.org/problem?id=1033
Time Limit: 2000MS
Memory Limit: 10000K
Case Time Limit: 1000MS
Special Judge
Description
You are taking part in the development of a "New Generation" operating system and the NG file system. In this file system all disk space is divided into N clusters of the equal sizes, numbered by integers from 1 to N. Each file occupies one or more clusters in arbitrary areas of the disk. All clusters that are not occupied by files are considered to be free. A file can be read from the disk in the fastest way, if all its clusters are situated in the successive disk clusters in the natural order.
Rotation of the disk with constant speed implies that various amounts of time are needed for accessing its clusters. Therefore, reading of clusters located near the beginning of the disk performs faster than reading of the ones located near its ending. Thus, all files are numbered beforehand by integers from 1 to K in the order of descending frequency of access. Under the optimal placing of the files on the disk the file number 1 will occupy clusters 1, 2, ..., S1, the file number 2 will occupy clusters S1+1, S1+2, ..., S1+S2 and so on (here Si is the number of clusters which the i-th file occupies).
In order to place the files on the disk in the optimal way cluster-moving operations are executed. One cluster-moving operation includes reading of one occupied cluster from the disk to the memory and writing its contents to some free cluster. After that the first of them is declared free, and the second one is declared occupied.
Your goal is to place the files on the disk in the optimal way by executing the minimal possible number of cluster-moving operations.
Rotation of the disk with constant speed implies that various amounts of time are needed for accessing its clusters. Therefore, reading of clusters located near the beginning of the disk performs faster than reading of the ones located near its ending. Thus, all files are numbered beforehand by integers from 1 to K in the order of descending frequency of access. Under the optimal placing of the files on the disk the file number 1 will occupy clusters 1, 2, ..., S1, the file number 2 will occupy clusters S1+1, S1+2, ..., S1+S2 and so on (here Si is the number of clusters which the i-th file occupies).
In order to place the files on the disk in the optimal way cluster-moving operations are executed. One cluster-moving operation includes reading of one occupied cluster from the disk to the memory and writing its contents to some free cluster. After that the first of them is declared free, and the second one is declared occupied.
Your goal is to place the files on the disk in the optimal way by executing the minimal possible number of cluster-moving operations.
Input
The first line of the input file contains two integers N and K separated by a space(1 <= K < N <= 10000).Then K lines follow, each of them describes one file. The description of the i-th file starts with the integer Si that represents the number of clusters in the i-th file (1 <= Si < N). Then Si integers follow separated by spaces, which indicate the cluster numbers of this file on the disk in the natural order.
All cluster numbers in the input file are different and there is always at least one free cluster on the disk.
All cluster numbers in the input file are different and there is always at least one free cluster on the disk.
Output
Your program should write to the output file any sequence of cluster-moving operations that are needed in order to place the files on the disk in the optimal way. Two integers Pj and Qj separated by a single space should represent each cluster-moving operation. Pj gives the cluster number that the data should be moved FROM and Qj gives the cluster number that this data should be moved TO.
The number of cluster-moving operations executed should be as small as possible. If the files on the disk are already placed in the optimal way the output should contain only the string "No optimization needed".
The number of cluster-moving operations executed should be as small as possible. If the files on the disk are already placed in the optimal way the output should contain only the string "No optimization needed".
Sample Input
20 34 2 3 11 121 73 18 5 10
Sample Output
2 13 211 312 418 610 85 207 520 7
大模拟。详见代码。
为何这样做是最优的?因为如此移动到最后,最开始移出到外面的那个碎片会回到它想去的地方。
完整代码:
/*172ms,256KB*/#include<cstdio>#include<cstring>#include<queue>using namespace std;int source[10001];///该簇所放碎片之前的簇位置int target[10001];///该簇碎片的目标簇位置queue<int> q;int main(){int n, k;while (~scanf("%d%d", &n, &k)){memset(source, 0, sizeof(source));memset(target, 0, sizeof(target));int s, count = 0, i = 1, j, t = 1; ///count为总碎片数bool tidy = false;while (k--){scanf("%d", &s);count += s;while (s--){scanf("%d", &j);source[i] = j;target[j] = i;++i;}}for (i = 1; i <= count; ++i)if (target[i] == 0)///空位置q.push(i);if (!q.empty())tidy = true;while (!q.empty()){i = q.front();q.pop();j = source[i];printf("%d %d\n", j, i);source[i] = i;target[i] = i;///更新target[j] = 0;if (j <= count)///多出的空位置放后面,所以我们先把能直接移动的都移动了,再处理后续要移动的q.push(j);}for (i = 1; i <= count; ++i)if (target[i] != i){if (!tidy)tidy = true;printf("%d %d\n", i, count + 1);///先移到末尾target[count + 1] = target[i];source[target[i]] = count + 1;target[i] = 0;t = i;///连续整理while (t <= count){j = source[t];printf("%d %d\n", j, t);target[t] = t;source[t] = t;target[j] = 0;t = j;}}if (!tidy)puts("No optimization needed");}}
- POJ 1033 / Northeastern Europe 1998 Defragment (模拟&队列)
- POJ 1032 / Northeastern Europe 1998 Parliament (贪心)
- poj 1033 Defragment 模拟+递归
- POJ-2208 Pyramids (Northeastern Europe 2002)
- POJ 3573 I18n (字符串乱搞)Northeastern Europe 2007
- poj 1033 defragment
- POJ 1033 Defragment
- POJ 1033 Defragment
- POJ 1033 Defragment
- POJ-1033-Defragment
- POJ 1033 Defragment 笔记
- Ants(Northeastern Europe 2007)
- poj 1033 Defragment 解题报告
- POJ 1033-Defragment 简单搜索
- poj 1033 Defragment 简单搜索
- POJ 1033 Defragment(搜索)
- POJ 1651 / ZOJ 1602 / Northeastern Europe 2001 Multiplication Puzzle(dp)
- POJ 1753 Flip Game(高斯消元入门超详细题解)——Northeastern Europe 2000
- C++实现设计模式:Observer Pattern
- php中分割网站网址取得特定参数
- redis学习笔记(一)
- C++ string详解
- MySQL-5.6.13 基本设置及其主从数据库
- POJ 1033 / Northeastern Europe 1998 Defragment (模拟&队列)
- 建造者模式
- Qt简介以及如何配置Qt使用VS2010进行开发
- 视图间跳转完成数据回调的四种方法
- 【数据结构】01.8种排序算法的稳定性和时间复杂度小结
- 阻塞和非阻塞IO
- recv send 阻塞和非阻塞
- Windows下安装、配置Weblogic
- Weblogic集群配置for linux