51nod-1205 流水线调度

来源:互联网 发布:农家乐商机数据 编辑:程序博客网 时间:2024/04/30 12:14

原题链接

1205 流水线调度
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
 收藏
 关注
N个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为a[i]和b[i]。你可以安排每个作业的执行顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。求这个最少的时间。
Input
第1行:1个数N,表示作业的数量。(2 <= N <= 50000)第2 - N + 1行:每行两个数,中间用空格分隔,表示在M1和M2上加工所需的时间a[i], b[i]。(1 <= a[i], b[i] <= 10000)。
Output
输出完成所有作业所需的最少时间。
Input示例
43 72 11 14 2
Output示例
14

Johnson算法
(1) 把作业按工序加工时间分成两个子集,第一个集合中在S1上做的时间比在S2上少,其它的作业放到第二个集合。先完成第一个集合里面的作业,再完成第二个集合里的作业。
(2) 对于第一个集合,其中的作业顺序是按在S1上的时间的不减排列;对于第二个集合,其中的作业顺序是按在S2上的时间的不增排列。在这里,我一个数组搞定,把这两个集合分别向两边插入。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define maxn 50005#define MOD 1000000007using namespace std;typedef long long ll;struct Node{friend bool operator < (const Node&a, const Node&b){return a.key < b.key; }int key, i, job;}node[maxn];int a[maxn], b[maxn], c[maxn]; int main(){//freopen("in.txt", "r", stdin);int n;scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d%d", a+i, b+i);}for(int i = 0; i < n; i++){node[i].key = a[i] < b[i] ? a[i] : b[i];node[i].i = i;node[i].job = a[i] < b[i];}sort(node, node+n);ll j = 0, k = n-1;for(int i = 0; i < n; i++){if(node[i].job) c[j++] = node[i].i;else c[k--] = node[i].i;}    j = a[c[0]];k = j + b[c[0]];for(int i = 1; i < n; i++){j += a[c[i]];k = k >= j ? k + b[c[i]] : j + b[c[i]];}printf("%I64d\n", k);return 0;}


0 0
原创粉丝点击