参考: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. hduoj-----(1068)Girls and Boys(二分匹配)

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. WordPress怎么在页面上添加目录

    要实现的如下功能,在页面上添加一个文章目录: 步骤:   1)在wordpress中,在Posts----Categories中建立目录, 2) 3)add new post,指定post所属的cat ...

  3. c#中的反射

    System.Reflection.AssemblySystem.Activator Assembly assembly = Assembly.load("namespace名") ...

  4. Objective-C( 三、方法的声明与实现)

    OC方法的声明与实现 oc方法的声明在@interface中 大括号外@end上面 oc方法的实现在@implementation 中@end上面 OC方法中,一个参数对应一个冒号 方法名: 例  f ...

  5. CSS 框模型——规定了元素框处理元素内容、内边距、边框和外边距的方式

    转自:http://www.w3school.com.cn/css/css_boxmodel.asp 要知道在父元素:float, rel, abs位置情况下,box模型的变换情况,请见:http:/ ...

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

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

  7. HDU 1681 Frobenius

    题目链接:Frobenius 思路:想了很久还是没转过弯来. 递推. 初始化vis[0] = 1,每次有四种方法扩展,这样能扩展到所有能被表示的数.上界的判定,如果一万以内的数都能被表示,那以后的数肯 ...

  8. spring 标注

    1.添加支持标注的spring中的jar包: spring-context.jar spring-context-support.jar 2.在xml中配置命名空间和schema <beans ...

  9. java 面向对象编程--第17章 I/O系统

    1.I/O操作指的是输入和输出流的操作.相对内存而言,当我们从数据源中将数据读取到内存中,就是输入流,也叫读取流.当我们将内存中处理好的数据写入数据源,就是输出流,也叫写入流. 2.流按照内容分类:字 ...

  10. --投资情况统计详情sql

    --投资情况统计详情sqlselect BidRecord.*, RegInfo.UserName,UserInfo.phone,BorrowInfo.Title,BorrowInfo.BorrowC ...