51Nod-1205 流水线调度

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值