WELCOME

任何一个伟大的目标,都有一个微不足道的开始。

「一本通 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 1n1000

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元大奖)

posted @ 2022-07-12 20:35  绿树公司  阅读(221)  评论(0)    收藏  举报