johnson算法
#include<iostream>
#include<stdio.h>
#include<algorithm>
#define N 100
using namespace std;
struct node
{
int a;//作业在m1上运行时间
int b;//作业在m2上运行时间
int index;//第几个作业
};
node job[N];
node job1[N]; //a<b的作业
node job2[N]; //a>=b的作业
bool cmp1(const node& a,const node& b)
{
return a.a<=b.a;
}
bool cmp2(const node& a,const node& b)
{
return a.b>=b.b;
}
void flowshow(int n)
{
int i1=0,i2=0;
for(int i=0;i<n;i++)
{
if(job[i].a<job[i].b)
{
job1[i1].a=job[i].a;
job1[i1].b=job[i].b;
job1[i1].index=job[i].index;
i1++;
}
else
{
job2[i2].a=job[i].a;
job2[i2].b=job[i].b;
job2[i2].index=job[i].index;
i2++;
}
}
sort(job1,job1+i1,cmp1);
sort(job2,job2+i2,cmp2);
int sum1=job1[0].a;
int sum2=job[0].b+sum1;
for(int i=1;i<i1;i++)
{
sum1+=job1[i].a;
sum2>sum1?sum2+job1[i].b:sum1+job1[i].b;
}
for(int i=0;i<i2;i++)
{
sum1+=job2[i].a;
sum2>sum1?sum2+job2[i].b:sum1+job2[i].b;
}
printf("%d\n",sum2);
for(int i=0;i<i1;i++)
printf("%d %d %d\n",job1[i].index,job1[i].a,job1[i].b);
for(int i=0;i<i2;i++)
printf("%d %d %d\n",job2[i].index,job2[i].a,job2[i].b);
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&job[i].a,&job[i].b);
job[i].index=i+1;
}
flowshow(n);
return 0;
}
/*
input
4
5 6
12 2
4 14
8 7
output
10
3 4 14
1 5 6
4 8 7
2 12 2
*/