(贪心)多机调度问题

某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间。

输入

第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n,m(1<=n<=10000,1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。

输出

所需的最短时间

样例输入

2

2 2

1 5

6 3

2 5 13 15 16 20

样例输出

5

28

这并不是一道oj上的题目,反正我是没找到。。。

应该属于一类题目。

解题思路就是贪心的思想。

我们现将所有的时间排序。

第一种情况:n<=m    时间最长的工作就是我们需要求解的总时间。

第二种情况:n>m

这时候我们就将m个机器分配给前m个时间最长的工作,直到有机器空闲下来,我们将闲下的机器继续向后分配。直到分配到没有工作可做了。当前的时间再加上还没有做完的工作的最长时间就是我们所要求的总时间。

代码:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 int a[1005],b[1005];
 7 bool cmp(int a,int b){
 8     return a>b;
 9 }
10 int main(){
11     int n,m;
12     int T;
13     cin>>T;
14     while(T--){
15         int n,m;
16         cin>>n>>m;
17         for(int i=0;i<n;i++){
18             scanf("%d",a+i);
19         }
20         memset(b,0,sizeof(b));
21         sort(a,a+n,cmp);
22         if(n<=m){
23             cout<<a[0]<<endl;
24             continue;
25         }else{
26             int sum=0;
27             int now=m;
28             while(now<n){
29                 sum++;
30                 int cnt=0;     //cnt是这分钟结束后有几台机器空闲下来
31                 for(int i=0;i<now;i++){
32                     b[i]++;
33                     if(b[i]==a[i]){
34                         cnt++;
35                     }
36                 }
37                 now+=cnt;
38             }
39             int mx=0;
40             for(int i=0;i<n;i++){
41                 if(a[i]>b[i])
42                     mx=max(mx,a[i]-b[i]);    //找出还没做完的工作的最长时间
43             }
44             cout<<sum+mx<<endl;
45         }
46     }
47     return 0;
48 }
时间: 2024-10-03 11:35:56

(贪心)多机调度问题的相关文章

贪心算法-----单线程:活动安排问题 多线程:多机调度问题

一.贪心算法的特点 顾名思义,贪心算法总是做出在当前看来是最好的选择.虽然贪心算法并不从整体最优上加以考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的优点是更简单,更直接且解题效率更高,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解. 二.贪心算法的理解 由于涉及到在做出在当前看来最好的选择,所以会经常采用排序算法,推荐使用快速排序算法,复杂度是O(nlgn),且在同等复杂度算法中效率是最高的, 本文涉及的排序都采用冒泡排序,只是注明需要排序而已. 贪心算法

多机调度问题

[问题] 设有n个独立的作业{1,2,3,...,n},由m台相同的机器进行加工处理.作业i所需的处理时间为ti.现约定,任何作业可以在任何一台机器上加工处理,但未完工前不允许中断处理.任何作业不能拆分成更小的子作业.多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成. [算法分析] 这个问题是一个NP完全问题,到目前为止还没有有效的解法.对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法. 采用最长处理时间作业优先的贪心选择策略可以设计出解多

贪心:区间调度问题

*/--> pre.src {background-color: Black; color: White;} 贪心:区间调度问题 有 n 项工作,每项工作分别在 si 时间开始,在 ti 时间结束.对于每项工作,你都可以选择参与与否.参与工作的时间段不能重复 (开始的瞬间和结束的瞬间重叠也是不允许的) 分析:在可选的工作中,每次都选取结束时间最早的工作 // CreateTime: 2015-04-07 21:45:48 #include <iostream> #include <

贪心算法-区间调度问题解之证明

一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3,......,N},第i个需求与一个开始时间s(i),结束时间f(i)相对应.如果没有两个需求在时间上重叠,我们就说需求的子集是相容的. 2. 目标:寻找一个最大的相容子集O. 3. 算法: 初始令R是所有需求的集合,设A为空 While ( |R| > 0 ) 选择一个最早结束的需求 把i加入到

贪心算法----区间调度问题

题目: 有n项工作,每项工作分别在si时间开始,在ti时间结束.对于每项工作,你都可以选择参与与否.如果选择了参与,那么自始至终都必须全程参与.此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的).你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?  1≤n≤100000  1≤si≤ti≤109.这道题目还可以称作不相交区间问题. 输入: 第一行:n 第二行:n个整数空格隔开,代表n个工作的开始时间 第三行:n个整数空格隔开,代表n个工作的结束时间 样例输入

零基础学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅.贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关.解题的一般步骤是:1.建立数学模型来描述问题:2.把求解的问题分成若干个子问题:3.对每一子问题求解,得到子问题的局部最优解:4.把子问题的局部最优

从零开始学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅. 贪心算法的定义: 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关. 解题的一般步骤是: 1.建立数学模型来描述问题: 2.把求解的问题分成若干个子问题: 3.对每一子问题求解,得到子问题的局部最优解: 4.把子

可用贪心算法解决的几个基本问题

可用贪心算法解决的几个基本问题 分类: 算法2011-08-24 12:36 950人阅读 评论(0) 收藏 举报 算法活动作业c 关键:看问题有没有贪心选择性质和最优子结构性质.有些问题看似是可以用贪心算法,但是实际用贪心算法却得不到最优解.构造贪心算法后,需要一定的证明来确定它的正确性.常用证明方法:反证法.调整法. 几个基本问题: 1. 活动安排问题. 设有n个活动的集合e={1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动

疯子的算法总结(四)贪心算法

一.贪心算法 解决最优化问题的算法一般包含一系列的步骤,每一步都有若干的选择.对于很多最优化问题,只需要采用简单的贪心算法就可以解决,而不需要采用动态规划方法.贪心算法使所做的局部选择看起来都是当前最佳的,通过局部的最优化选择来产生全局最优解.本文将介绍贪心算法的理论基础和一些简单应用.在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解,这种求解方法就是贪心算法. 设计贪心算法的步骤: 将最优化问题转化为这样一个