第1行:1个数N,表示作业的数量。(2 <= N <= 50000) 第2 - N + 1行:每行两个数,中间用空格分隔,表示在M1和M2上加工所需的时间a[i], b[i]。(1 <= a[i], b[i] <= 10000)。
输出完成所有作业所需的最少时间。
4 3 7 2 1 1 1 4 2
14
这道题就是让我们找一种排序方法。
我们对于作业A和作业B
如果A先执行,A的a和B的b肯定是单独花时间的,而A的b和B的a他们两个存在一个并行关系,我们取的最大值。所以A.a+B.b+max(A.b,B.a)
如果B先执行,则 B.a+A.b+max(B.b,A.a)
我们比较两者的大小进行排序。
还有一种做法就是Johnson算法
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5;
struct node
{
int a, b;
}a[maxn];
int cmp(node a, node b){
return a.a + max(a.b, b.a) + b.b < b.a + max(b.b, a.a) + a.b;
}
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d%d", &a[i].a, &a[i].b);
}
int m1, m2;
sort(a + 1, a + n + 1, cmp);
m1 = a[1].a; m2 = a[1].a + a[1].b;
for(int i = 2; i <= n; i++){
m1 += a[i].a;
m2 = max(m1, m2) + a[i].b;
}
printf("%d\n", m2);
return 0;
}
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAXN = 5e4 + 5;
struct task
{
int a;
int b;
} TaskA[MAXN], TaskB[MAXN];
bool cmpA(task a, task b)
{
return a.a <= b.a;
}
bool cmpB(task a, task b)
{
return a.b >= b.b;
}
int main()
{
int N;
cin >> N;
int a, b;
int posA = 0, posB = 0;
int sumA = 0, sumB = 0;
for (int i = 0; i < N; i++)
{
scanf("%d %d", &a, &b);
if (a < b)
{
TaskA[posA].a = a;
TaskA[posA++].b = b;
sumA += b;
}
else
{
TaskB[posB].a = a;
TaskB[posB++].b = b;
sumB += a;
}
}
sort(TaskA, TaskA + posA, cmpA);
sort(TaskB, TaskB + posB, cmpB);
for (int i = 0; i < posB; i++)
{
TaskA[posA++] = TaskB[i];
}
int ans = TaskA[0].a + TaskA[0].b;
int sum = TaskA[0].a;
for (int i = 1; i < posA; i++)
{
sum += TaskA[i].a;
ans = sum < ans ? ans + TaskA[i].b : sum + TaskA[i].b;
}
cout << ans << '\n';
return 0;
}