【题目描述】
某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。
某个产品 i 在 A,B 两车间加工的时间分别为Ai,Bi。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。
这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。
【输入】
第一行仅—个数据 n ,表示产品的数量;
接下来 n 个数据是表示这 n 个产品在 A 车间加工各自所要的时间;
最后的 n 个数据是表示这 n 个产品在 B 车间加工各自所要的时间。
【输出】
第一行一个数据,表示最少的加工时间;
第二行是一种最小加工时间的加工顺序。
【输入样例】
5
3 5 8 7 10
6 2 1 4 9【输出样例】
34
1 5 4 2 3
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 100000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
struct Node{
int num;
int id;
}m[N];
int a[N],b[N];
int res[N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++){
m[i].num=min(a[i],b[i]);
m[i].id=i;
}
for(int i=1;i<=n-1;i++){
for(int j=i+1;j<=n;j++){
if(m[i].num>m[j].num){
swap(m[i],m[j]);
}
}
}
int head=0,tail=n+1;
for(int i=1;i<=n;i++){
int num=m[i].num;
int id=m[i].id;
if(num==a[id])
res[++head]=id;
else
res[--tail]=id;
}
int timeA=0,timeB=0;
for(int i=1;i<=n;i++){
timeA+=a[res[i]];
if(timeB<timeA)
timeB=timeA;
timeB+=b[res[i]];
}
printf("%d\n",timeB);
for(int i=1;i<=n;i++)
printf("%d ",res[i]);
printf("\n");
return 0;
}
信息学奥赛一本通T1425:贪心算法 加工生产调度 归属于 贪心算法,更多同类题解源程序见:贪心算法 和 加工生产调度
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!