参考: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. CRM创建物料FM2

    这是在佛山好帮手时受启发而研究出来的,创建物料,带单位,类型组 经测试....算了,不说了,有什么限制自己测去...今天心情不好... FUNCTION ZLY_CREATE_PRODUCT_UNIT ...

  2. 我的R代码备份

    1 #f1=scan(file="f1.txt");  2 #f2=scan(file="f2.txt");  3 f=scan(file="5.2_ ...

  3. Word文档增加快捷键

  4. NodeJS无所不能:细数10个令人惊讶的NodeJS开源项目

    在几年的时间里,NodeJS逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量网站都采用NodeJS进行开发,像PayPal,此外,开发人员还可以使用它来开发一些快速移动Web框架. 除 ...

  5. Linux CC攻击脚本

    CC(ChallengeCollapsar)主要是用来攻击页面的.大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库 ...

  6. 学习记录014-ssh批量分发

    一.ssh服务介绍 1.ssh安全的加密协议用于远程连接服务器 2.默认端口是22,安全协议版本ssh2,它能同时支持RSA和DSA秘钥,SSH1只支持RSA 3.服务端主要包含两个服务功能ssh远程 ...

  7. configure错误列表供参考

    另外附一些常见的configure错误列表供参考: configure: error: No curses/termcap library found网上有的说法是:--with-named-curs ...

  8. lucene 过滤结果

    package cn.itcast.h_filter; import java.util.ArrayList; import java.util.List; import org.apache.luc ...

  9. wp8.1 Study13:在WP8.1中分享文件和数据

    绪论:不同于windows, 在wp8.1中,如果不止一个程序可以接受其Uri或者文件,shell会提供一个界面让用户选择用哪个程序.而在windows中,用户可以在设置那里设置各种文件和Uri的默认 ...

  10. UITextView添加一个placeholder功能

    控件UITextField有个placeholder属性,UITextField和UITextView使用方法基本类似,有两个小区别:1.UITextField单行输入,而UITextView可以多行 ...