タイトルソース:loj
タイトル説明
工場で製品の注文を受けました。この製品はAおよびBワークショップで処理されたため、Bワークショップで処理する前にAワークショップで処理する必要があります。
ワークショップAとワークショップBでの特定の製品の処理時間はそれぞれです。総処理時間を最小限に抑えるために、この製品の処理シーケンスを調整する方法。
ここでの処理時間とは、最初の製品の処理開始から、AおよびBワークショップで処理されたすべての製品の終了までの時間を指します。
入力フォーマット
最初の行は、製品の数量を示す1つのデータのみです。
次のデータは、この製品がワークショップAで処理されるのに必要な時間を表しています。
最後のデータは、この製品がワークショップBで処理されるのに必要な時間を表しています。
出力フォーマット
最初の行の1つのデータは、最小処理時間を示しています。
2行目は、処理時間が最小の処理シーケンスです。
サンプル入力
5
3 5 8 7 10
6 2 1 4 9
サンプル出力
34
1 5 4 2 3
データ範囲とヒント
100%データ、0 <n <1000の場合、すべての値は整数です。
アイデア
合計処理時間を最小化するための処理シーケンスを探すことは、マシンのアイドル時間を最小化することです。Aワークショップが処理を開始すると、Aワークショップは引き続き機能します。重要なのは、Bワークショップが処理中にAワークショップを待たなければならない場合があるということです。明らかに、最初の製品がワークショップAで処理されるとき、ワークショップBは待機する必要があり、最後の製品がワークショップBで処理されるとき、ワークショップAもワークショップBの完了を待機します。
ワークショップでのアイドル時間を最小限に抑えるには、Aワークショップで処理時間が最も短い製品を最初に処理して、Bワークショップが最短の空き時間、Bワークショップで最短の処理時間で処理を開始できるようにする必要があると大胆に推測できます。ワークショップAがワークショップBの完了を最短時間で待つことができるように、製品は最終処理に配置されます。
したがって、Aワークショップでは処理時間が短い製品を優先し、Bフレームでは処理時間が短い製品を優先する必要があります。
したがって、私たちがしなければならないことは、
(1)ワークショップAで処理時間が最も短い部品を優先して、ワークショップBが最速で処理を開始できるようにすることです。
(2)処理時間が最も短い製品をワークショップBに配置します。最後のワークショップAのアイドル時間を最小限に抑えるために、最終処理に入れます。
コード
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,a[N],b[N],order[N];
struct node{
int time,belong,id;
}c[N];
void init()
{
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]);
c[i].id=i;
if (a[i]<b[i]) //在A上加工的时间更短
{
c[i].time=a[i];
c[i].belong=0;
}
else //在B上加工的时间更短
{
c[i].time=b[i];
c[i].belong=1;
}
}
return;
}
int cmp(node x,node y) {
return x.time<y.time; }
void make_order()
{
int cnt1=1,cnt2=n;
sort(c+1,c+1+n,cmp);
for (int i=1;i<=n;i++)
{
if (c[i].belong==0) //在A上加工的时间更短,从头开始排
order[cnt1++]=c[i].id;
else //在B上加工的时间更短,从尾开始排
order[cnt2--]=c[i].id;
}
return;
}
void work()
{
int A=0,B=0;//A:A的加工时间 B:B的加工时间
for (int i=1;i<=n;i++)
{
A+=a[order[i]];
if (B<A) B=A;
B+=b[order[i]];
}
cout<<B<<endl;
for (int i=1;i<=n;i++) printf("%d ",order[i]);
return;
}
int main()
{
init();
make_order();
work();
return 0;
}