「一本通 1.1 例 4」加工生产调度(贪心算法)(luogu P1248)题解
加工生产调度
题目描述
某工厂收到了 n n n 个产品的订单,这 n n n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。
某个产品 i i i 在 A、B 两车间加工的时间分别为 A i , B i A_i,B_i Ai,Bi。怎样安排这 n n n 个产品的加工顺序,才能使总的加工时间最短。
这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A、B 两车间加工完毕的时间。
输入格式
第一行仅—个整数 n n n,表示产品的数量。
接下来一行 n n n 个整数是表示这 n n n 个产品在 A 车间加工各自所要的时间。
最后的 n n n 个整数是表示这 n n n 个产品在 B 车间加工各自所要的时间。
输出格式
第一行一个整数,表示最少的加工时间。
第二行是一种最小加工时间的加工顺序。
输入输出样例
样例输入1
5
3 5 8 7 10
6 2 1 4 9
样例输出1
34
1 5 4 2 3
说明/提示
1 ≤ n ≤ 1000 1\leq n\leq 1000 1≤n≤1000。
Code
#include <bits/stdc++.h>
using namespace std;
struct ad
{
int a, b, id;
} a[1005];
int n, A, B, i = 1;
bool cmp(ad a, ad b)
{
bool f1 = a.a <= a.b, f2 = b.a <= b.b;
if (f1 & f2)
return a.a < b.a;
if (f1 ^ f2)
return f1;
return a.b > b.b;
}
int main()
{
cin >> n;
for (; i <= n; ++i)
cin >> a[i].a, a[i].id = i;
for (i = 1; i <= n; ++i)
cin >> a[i].b;
sort(a + 1, a + n + 1, cmp);
for (i = 1; i <= n; ++i)
A += a[i].a, B = max(A, B) + a[i].b;
printf("%d\n", B);
for (int i = 1; i <= n; ++i)
printf("%d ", a[i].id);
return 0;
}
广告
绿树公司 - 官方网站:https://wangping-lvshu.github.io/LvshuNew/
绿树智能 - 官方网站:https://wangping-lvshu.github.io/LvshuZhineng/
(现在使用,人人均可获得300元大奖)

浙公网安备 33010602011771号