求用最小堆实现机器调度问题

tjuwudi 2008-03-21 03:53:39
如题,所有的任务执行完成使所用的机器数最少,要求用最小堆实现,麻烦附上思路和源代码,谢谢!

Sample Input

3//3个任务
3 5//开始时间和结束时间
1 4
4 5

Sample Output

2//最少用两台机器


...全文
270 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xero_123 2010-09-05
  • 打赏
  • 举报
回复
不知道楼主为什么要求最最小堆来实现,但是我认为这个很类似编程之美里面的,面试安排的问题,总体思路就是,当前俺开始时间先后顺序排序,之后每次遇到一个开始时间则资源数目加一,每次遇到一个结束时间点则资源数目减一个,这样在整个过程中的最大资源数字就是所求,
qq120848369 2010-05-22
  • 打赏
  • 举报
回复
想用最小堆实现贪心策略么.
最小堆就不要自己写了,这个工作应该学数据结构时候做.
现在,你可以用STL里的priority_queue 来实现.
每次取一个开始时间最早的(堆顶),判断与前一次决定的活动的结束时间的关系,不重叠就决定它,冲突了就再取一个.
cmy0209 2010-05-22
  • 打赏
  • 举报
回复
没写完
cmy0209 2010-05-22
  • 打赏
  • 举报
回复
#include"stdio.h"
#include"malloc.h"

struct machinenode{
int ID; //机器号
int avail //机器可用时刻
};
struct jobnode{
int ID; //作业号
int time; //处理时间
};

typedef struct{
int key;
}Dui;

int rn(int n){
int i,r[20];
printf("输入%d个作业的信息:",n);
for(i=1;i<=n;i++)
scanf("%d",&r[i]);
return r;
}

int rm(int m){
int i,r[20];
printf("输入%d台机器的编号:",m);
for(i=1;i<=m;i++)
scanf("%d",&r[i]);
return r;
}

void siftB(Dui r[],int k,int m){ //大根堆的调整算法
int j,i;
i=k;j=2*i;
while(j<=m){
if(j<m&&r[j].key<r[j+1].key) j++;
//比较左右孩子的大小,使j为较大的孩子的下标
if(r[i].key<r[j].key){
r[i]<->r[j]; //较大的孩子与根交换
i=j;j=2*i;
}
else break;
}
}
void creatheapB(Dui r[],int m){ //建大根堆
for(i=n/2;i>=1;--i) //自第n/2个元素开始筛选
siftB(r,i,n);
}

void siftL(Dui r[],int k,int m){ //小根堆的调整算法
int j,i;
i=k;j=2*i;
while(j<=m){
if(j<m&&r[j].key>r[j+1].key) j++;
//比较左右孩子的大小,使j为较小的孩子的下标
if(r[i].key>r[j].key){
r[i]<->r[j]; //较小的孩子与根交换
i=j;j=2*i;
}
else break;
}
}
void creatheapL(Dui r[],int m){ //建小根堆
for(i=n/2;i>=1;--i) //自第n/2个元素开始筛选
siftL(r,i,n);
}

void heapsort(Dui r[],int n){ //堆排序
int i;
for(i=n/2;i>=1;i--) sift(r,i,n);
for(i=n;i>1;i--){
r[1]<->r[i];
sift(r,1,i-1);
}
}

void judeg(int m,int n){
int i,rn[20],rm[20];
rn=rn(n);
rm=rm(m);
if(n<=m){
for(i=2;i<=n;i++)
if(rn[1]<rn[i])
rn[1]=rn[i];
printf("最短时间为:%d",rn[1]);
}
else{
creatheapB(rn,n);
creatheapL(rm,m);
}
}

void main(){
int m,n;
printf("输入机器数m和作业数n:");
scanf("%d%d",&m,&n);
judge(m,n);
}
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
lz要干嘛?
meiZiNick 2008-04-30
  • 打赏
  • 举报
回复
不明LZ在说什么
  • 打赏
  • 举报
回复
这个很像“会场分配”问题,贪心算法可以解决。

首先为第一台机器分配任务,每一步选择的都是和前面的任务不冲突同时结束时间最早的任务;
排完第一台机器之后,如果还有任务剩下来,那再按照同样的方式为第二台机器排任务;
如果还有剩余,再为第三台机器排任务;
……
所有任务派完之后,最少用到几台机器的数量也出来了。


最小堆按照结束时间来判定,结束时间早的放在上层。每次从堆中取的都是结束时间最早的任务,如果该任务和这台机器前面的任务不发生冲突,那么就把这个任务排给这台机器;如果产生冲突,则把这个任务留给下一台机器。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧