题目如下图:
题解:总用时最短,即让机器空闲时间最短。一旦A机器开始,其将进行作业直到最后。B机器则在加工过程中可能会在等待A机器,显然A机器加工第一个产品时,B机器必须等待,而最后一个产品在B机器上加工时,A机器则一停止并等待B机器完工。
使机器空间时间最短,把A机器上加工时间最短的产品最先加工,可使得B机器在最短的等待时间后开始加工;把B机器加工时间最短的产品放在最后,使得A机器用最短的时间等待B机器完工。
尝试用贪心策略:
1、比较对应第i个产品的A机器加工时间ai,B机器加工时间bi,保存对应第i个产品的最小加工时间为mi。
2、将最少加工时间按照从小到大进行排序,然后从第1个开始处理,若mi=ai,则将第i个产品从头开始排序的任务后面,否则,将它排在从尾开始排序的任务前面。
ps:这边一本通不能用sort直接对结构体进行快速排序(why?),所以用了选择结构来排序
一本通代码:
#include<bits/stdc++.h>
using namespace std;
struct stu{
int a,b,m,i;
}s[10001];
int res[10001];
//一本通不能用这个排序方式???
bool cmp(stu x,stu y){
return x.m<y.m;//从小到大排序
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i){
cin>>s[i].a;
}
for(int i=1;i<=n;++i){
cin>>s[i].b;
s[i].i = i;
s[i].m = min(s[i].a,s[i].b);
}
//sort(s+1,s+n+1,cmp);//一本通不能用这个排序方式
for(int i=1;i<=n-1;++i){
for(int j=i+1;j<=n;++j){
if(s[i].m>s[j].m){
swap(s[i].a,s[j].a);
swap(s[i].b,s[j].b);
swap(s[i].m,s[j].m);
swap(s[i].i,s[j].i);
}
}
}
int front = 1;
int back = n;
for(int i=1;i<=n;++i){
if(s[i].a==s[i].m){//A工厂的时间较短
res[front++] = i;//记住当前序号,从前往后
}else{
res[back--] = i;//记住当前序号 ,从后往前
}
}
int t1=0,t2=0;
for(int i=1;i<=n;++i){
t1 += s[res[i]].a;//累加A厂的加工时间
t2 = max(t1,t2);//当前累加最大时间
t2 += s[res[i]].b;//获取最长加工时间后,累加B厂的加工时间
}
cout<<t2<<endl;
for(int i=1;i<=n;++i)cout<<s[res[i]].i<<" ";
return 0;
}