参考:http://blog.csdn.net/ll365594480/article/details/6843449

【题意】磁盘分为N个簇,一个文件可以占用K个簇,(1 <= K < N <= 10000),给出各个文件的占用磁盘的情况,也就是一个文件占用了哪些簇,想要进行碎片整理,就是把这些簇按顺序整理到磁盘的最顶部。

初始状态是这样的,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

【思路】先判断该位置是否为空,为空就直接移动,如果不为空的话,判断是否成环,如果成环的话,就领取一个空点,把其中一个移入,用栈处理会比较方便。

#include<iostream>
#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
const int N=+;
int vis[N];
int n,m,k;
stack<int>st;
int cnt=; void solve()
{
int next,i,move_num=;
for(i=;i<=n;i++)
{
if(vis[i]==i) continue;
else if(vis[i]!=)
{
st.push(i);
next=vis[i];
bool flag;
while()
{
if(vis[next]==i)
{
flag=true;
break;
}
else if(vis[next]==)
{
flag=false;
break;
}
st.push(next);
next=vis[next];
}
if(flag)
{
int j;
for(j=n;j>=;j--)
{
if(vis[j]==)
break;
}
vis[j]=vis[next];
printf("%d %d\n",next,j);
while(!st.empty())
{
int top=st.top();
vis[next]=vis[top];
printf("%d %d\n",top,next);
st.pop();
next=top;
move_num++;
}
vis[next]=vis[j];
vis[j]=;
printf("%d %d\n",j,next);
}
else
{
while(!st.empty())
{
int top=st.top();
vis[next]=vis[top];
printf("%d %d\n",top,next);
st.pop();
next=top;
move_num++;
}
vis[next]=;
}
}
}
if(move_num==)
printf("No optimization needed\n");
} int main()
{
while(~scanf("%d%d",&n,&m))
{
cnt=;
memset(vis,,sizeof(vis));
for(int i=;i<=m;i++)
{
scanf("%d",&k);
for(int j=;j<=k;j++)
{
int x;
scanf("%d",&x);
vis[x]=cnt++;
}
}
solve();
}
return ;
}

hdu1033Defragment的更多相关文章

随机推荐

  1. linux----关于定位和查找

    1.top --查看进程2.su --临时切换用户命令[root@tomato2 ~]# sudo su gongxijun[gongxijun@tomato2 root]$ 3.whoami --- ...

  2. java二维数组简单初步理解

    二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. int[][] arr = {{1, 2, 3}, {4, 5, 6}}; System.out.println(arr[0][ ...

  3. C++构造函数和析构函数调用虚函数时都不会使用动态联编

    先看一个例子: #include <iostream> using namespace std; class A{ public: A() { show(); } virtual void ...

  4. linux win 的换行转换

    Linux和Windows和换行符不一样.Windows下是CRLF(\r\n或0d0a),Linux下是LF(\n或0a).在Linux下有时会遇到从Windows过来的文本文件,这些文件带了Win ...

  5. php和AJAX用户注册演示程序

    <! doctype html public "-//w3c//dtd html 4.0//en" "http://www.w3.org/tr/rec-html14 ...

  6. Jquery select 选中项中自定义的值

    给select 赋值,除了已有的value及text,新建一属性simple_name function GetDicOfficeList(dicType, sid) { $.ajax({ url: ...

  7. mysqldump使用语法

    复制代码 代码如下: mysqldump -u user -p db tab1 tab2 > db.sql   恢复 复制代码 代码如下: mysql -u user -p db < db ...

  8. uva 1210

    #include<iostream> #include<cstring> using namespace std; + ; bool notprime[MAXN];//值为fa ...

  9. C#Base64编码

    一. Base64的编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据 ...

  10. Linux-如何查看登陆shell的类型

    输入一个系统不认识的命令(如#ig)获得系统提示 aix/#ig ksh ig not found #echo $ (适用sh/ksh) aix/#echo $ ksh #echo $SHELL(用户 ...