hdu1033Defragment
参考: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的更多相关文章
随机推荐
- linux----关于定位和查找
1.top --查看进程2.su --临时切换用户命令[root@tomato2 ~]# sudo su gongxijun[gongxijun@tomato2 root]$ 3.whoami --- ...
- java二维数组简单初步理解
二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. int[][] arr = {{1, 2, 3}, {4, 5, 6}}; System.out.println(arr[0][ ...
- C++构造函数和析构函数调用虚函数时都不会使用动态联编
先看一个例子: #include <iostream> using namespace std; class A{ public: A() { show(); } virtual void ...
- linux win 的换行转换
Linux和Windows和换行符不一样.Windows下是CRLF(\r\n或0d0a),Linux下是LF(\n或0a).在Linux下有时会遇到从Windows过来的文本文件,这些文件带了Win ...
- php和AJAX用户注册演示程序
<! doctype html public "-//w3c//dtd html 4.0//en" "http://www.w3.org/tr/rec-html14 ...
- Jquery select 选中项中自定义的值
给select 赋值,除了已有的value及text,新建一属性simple_name function GetDicOfficeList(dicType, sid) { $.ajax({ url: ...
- mysqldump使用语法
复制代码 代码如下: mysqldump -u user -p db tab1 tab2 > db.sql 恢复 复制代码 代码如下: mysql -u user -p db < db ...
- uva 1210
#include<iostream> #include<cstring> using namespace std; + ; bool notprime[MAXN];//值为fa ...
- C#Base64编码
一. Base64的编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据 ...
- Linux-如何查看登陆shell的类型
输入一个系统不认识的命令(如#ig)获得系统提示 aix/#ig ksh ig not found #echo $ (适用sh/ksh) aix/#echo $ ksh #echo $SHELL(用户 ...