流水线调度(51Nod-1205)
生活随笔
收集整理的這篇文章主要介紹了
流水线调度(51Nod-1205)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
N個作業{1,2,…,n}要在由2臺機器M1和M2組成的流水線上完成加工。每個作業加工的順序都是先在M1上加工,然后在M2上加工。M1和M2加工作業i所需的時間分別為a[i]和b[i]。你可以安排每個作業的執行順序,使得從第一個作業在機器M1上開始加工,到最后一個作業在機器M2上加工完成所需的時間最少。求這個最少的時間。
輸入
第1行:1個數N,表示作業的數量。(2 <= N <= 50000)
第2 - N + 1行:每行兩個數,中間用空格分隔,表示在M1和M2上加工所需的時間a[i], b[i]。(1 <= a[i], b[i] <= 10000)。
輸出
輸出完成所有作業所需的最少時間。
輸入樣例
4
3 7
2 1
1 1
4 2
輸出樣例
14
思路:兩機器的單車間調度問題,使用 Johnson 法則解決即可
源程序
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<bitset> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 100000+5; const int dx[] = {-1,1,0,0,-1,-1,1,1}; const int dy[] = {0,0,-1,1,-1,1,-1,1}; using namespace std; struct Node{int num;int id;bool operator < (const Node &rhs)const{return num<rhs.num;} }m[N]; int a[N],b[N]; int res[N]; int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);for(int i=1;i<=n;i++){m[i].num=min(a[i],b[i]);m[i].id=i;}sort(m+1,m+1+n);int head=0,tail=n+1;for(int i=1;i<=n;i++){int num=m[i].num;int id=m[i].id;if(num==a[id])res[++head]=id;elseres[--tail]=id;}int timeA=0,timeB=0;for(int i=1;i<=n;i++){timeA+=a[res[i]];if(timeB<timeA)timeB=timeA;timeB+=b[res[i]];}printf("%d\n",timeB);return 0; }總結
以上是生活随笔為你收集整理的流水线调度(51Nod-1205)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理论基础 —— 二叉树 —— 线索链表
- 下一篇: 数据结构 —— 树状数组