1. 程式人生 > >51nod 1205 流水線排程(Johnson規則)

51nod 1205 流水線排程(Johnson規則)

對於加工順序相同的兩個或兩個以上作業在兩臺機器上的加工排序,稱之為:n個作業兩臺機床的作業排序問題,經典的啟發式排序方法為Johnson規則。
其目的是最小化Makespan。
討論版裡有大佬詳細推導。。。
資料:
https://wenku.baidu.com/view/28dd298751e79b89680226cc.html
這就是個套板子的題目了。。

#include <bits/stdc++.h>
using namespace std;

struct node
{
    int a,b;
};
vector<node> p,s;

int cmpp(const
node& a, const node& b) { return a.a < b.a; } int cmps(const node& a, const node& b) { return a.b > b.b; } int main() { int n; node tn; scanf("%d",&n); for(int i = 0; i < n; ++i) { scanf("%d %d",&tn.a,&tn.b); if(tn.b > tn.a) p.push_back(tn); else
s.push_back(tn); } sort(p.begin(),p.end(),cmpp); sort(s.begin(),s.end(),cmps); p.insert(p.end(),s.begin(),s.end()); int res = p[0].a+p[0].b; int sum = p[0].a; for(int i = 1; i < p.size(); ++i) { sum += p[i].a; res = sum < res ? res+p[i].b:sum+p[i].b; } printf
("%d\n",res); return 0; }