提交时间:2024-06-10 10:35:37
运行 ID: 150971
#include<iostream> #include<algorithm> using namespace std; const int maxn = 1e4 + 10; struct Node{ int time, index;//工件i在A,B上最短加工时间和序号i }job[maxn]; bool cmp(Node &a, Node &b){ return a.time < b.time;//按最短时间排序 } int a[maxn], b[maxn], n; int ans[maxn];//最佳调度顺序 int main(){ cin >> n; for(int i = 1; i <= n; i ++){ job[i].index = i;//序号 cin >> a[i];//在A上加工的时间 } for(int i = 1; i <= n; i ++){ cin >> b[i];//在B上加工的时间 job[i].time = min(a[i], b[i]);//获取A和B上加工的最短时间 } sort(job + 1, job + n + 1, cmp);//按时间排序 int x = 1, y = n; for(int i = 1; i <= n; i ++){ if(job[i].time == a[job[i].index]){//如果在A的时间更短 ans[x ++] = job[i].index;//A时间短的往前面塞 }else{ ans[y --] = job[i].index;//B时间段的往后面塞 } } //记住,ans里存的是下标 int fa = a[ans[1]];//fa为i在车间A加工完需要的时间 int fb = fa + b[ans[1]];//fb为i在车间B加工完需要的时间 for(int i = 2; i <= n; i ++){ //i开始在车间B加工时需要满足两个条件: //一个是i在A加工完成,另一个是i-1在B加工完成 //看看谁最晚,有一个没好的话,i都没法在车间B加工。 fb = max(fa + a[ans[i]], fb) + b[ans[i]]; fa += a[ans[i]]; } cout << fb << endl;//加工总时长 for(int i = 1; i <= n; i ++) cout << ans[i] << ' '; return 0; }