http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1205
普通的二级排序肯定不行 就试了一下只考虑相邻的两个元素谁先还是谁后的排序
说不太清楚为什么。。
网上说是Johnson算法 粘贴如下
1:将任务分为两类,A类任务t1<t2,B类任务t1>=t2
2:两类任务分别排序,其中A类按 t1 递增排序,B类按 t2 递减排序
3:合并两类,将第二类任务接到第一类任务后面,此时任务的顺序最佳
4:遍历所有任务,计算总耗时
其实都是一个意思 都是为了使第二个步骤的空闲间隙尽可能的小 所谓的Johnson算法也是保证两两最优吧
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
struct node
{
int a,b;
};
node ary[maxn];
int n;
bool cmp(node n1,node n2)
{
return n1.a+max(n1.b,n2.a)+n2.b<n2.a+max(n2.b,n1.a)+n1.b;
}
int main()
{
int i,ans,tmp;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d%d",&ary[i].a,&ary[i].b);
sort(ary+1,ary+n+1,cmp);
ans=0,tmp=0;
for(i=1;i<=n;i++)
{
ans+=ary[i].a;
tmp-=ary[i].a;
tmp=max(tmp,0)+ary[i].b;
}
ans+=tmp;
printf("%d\n",ans);
return 0;
}