N个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为aii和bii。你可以安排每个作业的执行顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。求这个最少的时间。
Input
第1行:1个数N,表示作业的数量。(2 <= N <= 50000)
第2 - N + 1行:每行两个数,中间用空格分隔,表示在M1和M2上加工所需的时间aii, bii。(1 <= aii, bii <= 10000)。
Output
输出完成所有作业所需的最少时间。
Sample Input
4 3 7 2 1 1 1 4 2
Sample Output
14
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[50005],b[50005],c[50005],bg,ed;
struct node
{
int v,flag,index;
}nod[50005];
bool cmp(node n1,node n2)
{
return n1.v < n2.v;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i = 1;i <= n;++i)
{
scanf("%d%d",&a[i],&b[i]);
if(a[i] <= b[i])
{
nod[i].index = i;
nod[i].flag = 1;
nod[i].v = a[i];
}
else
{
nod[i].index = i;
nod[i].flag = 2;
nod[i].v = b[i];
}
}
sort(nod+1,nod+n+1,cmp);
bg = 0,ed = n+1;
for(int i = 1;i <= n;++i)
{
if(nod[i].flag == 1)
c[++bg] = nod[i].index;
else
c[--ed] = nod[i].index;
}
long long asum = 0,bsum = 0,ans = 0;
for(int i = 1;i <= n;++i)
{
if(asum + a[c[i]] >= bsum)
{
asum = asum+a[c[i]];
bsum = asum+b[c[i]];
ans = bsum;
}
else
{
asum+=a[c[i]];
bsum+=b[c[i]];
ans = bsum;
}
}
printf("%lld\n",ans);
}
return 0;
}