参考: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. IntelliSense: 应输入声明的解决方案

    出现问题的原因暂时没搞清楚,只是找到了解决方案,方案如下: 工具-->选项-->文本编辑器-->C/C++-->高级-->禁用自动更新-->True

  2. springMvc配置编码过滤器

    在web.xml中配置 <!-- 编码过滤器 --> <filter> <filter-name>characterEncodingFilter</filte ...

  3. 修改Linux系统时区

    修改配置文件来修改时区1.修改/etc/sysconfig/clock         ZONE=Asia/Shanghai 2.rm /etc/localtime3.链接到上海时区文件 ln -sf ...

  4. hadoop入门之设置datanode的心跳时间的方法

    做作业的过程中发现,把一节点停掉,dfsadmin和50070都无法马上感知到一个data node已经死掉 HDFS默认的超时时间为10分钟+30秒.这里暂且定义超时时间为timeout计算公式为: ...

  5. hadoop主节点(NameNode)备份策略以及恢复方法

    link:http://jiajun.iteye.com/blog/809125 一.dits和fsimage 首先要提到两个文件edits和fsimage,下面来说说他们是做什么的. 集群中的名称节 ...

  6. Javascript面向对象编程:构造函数的继承

    今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = & ...

  7. JavaScript 事件委托的技术原理

    如今的 JavaScript 技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们 ...

  8. CentOS 6.2下SVN服务器的安装与配置

    安装了一下SVN服务器,本文没有与Apache整合,过程如下: 一,下载相关软件: [root@youxia201 test]# wget http://subversion.tigris.org/d ...

  9. Hive的Transform功能

    Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况.例如,按日期统计每天出现的uid数,通常用如下的SQL SELECT date, ...

  10. 统计sql语句执行效率

    --统计sql语句执行效率SELECT (total_elapsed_time / execution_count)/1000 N'平均时间ms' ,total_elapsed_time/1000 N ...