51nod 1205 流水線排程(Johnson規則)
阿新 • • 發佈:2019-01-03
對於加工順序相同的兩個或兩個以上作業在兩臺機器上的加工排序,稱之為: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;
}