1425:【例题4】加工生产调度
1425:【例题4】加工生产调度
题解
求一个加工顺序使得加工总用时最短,就是让机器的空闲时间最短。
一且A机器开始加工,则A机器将会不停地进行作业,
关键是B机器在加工过程中有可能要等待A机器。很明显第一个部件在A机器上加工时,B机器必须等待,最后一个部件在B机器上加工时,A机器也在等待B机器的完工
可以大胆猜想,要使机器总的空闲时间最短,就要把在A机器上加工时间最短的部件最先加工,这样使得B机器能在最短的空闲时间内开始加工;把在B机器上加工时间最短的部件放在最后加工,这样使得A机器用最短时间等待B机器完工
于是我们可以设计出这样的贪心策略:
将M按照从小到大的顺序排序,然后从第1个开始处理,若Mi=ai,则将它排在从头开始的作业后面,若Mi=bi,则将它排在从尾开始的作业前面。
代码
1.(选择排序版本,蓝书上的)
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <string> #include <cstring> using namespace std; int n, ans[10001],a[10001],b[10001],m[10001],s[10001]; void read() { 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]); } void solve() { for (int i = 1; i <= n; i++) { m[i] = min(a[i], b[i]); s[i] = i; } for(int i=1;i<=n-1;i++) for(int j=i+1;j<=n;j++) { if(m[i]>m[j]) { swap(m[i],m[j]); swap(s[i],s[j]); } } int k = 0, t = n + 1; for (int i = 1; i <= n; i++) { if (m[i] == a[s[i]]) { ++k; ans[k] = s[i]; } else { --t; ans[t] = s[i]; } } int t1 = 0, t2 = 0; for (int i = 1; i <= n; i++) { t1 += a[ans[i]]; if (t2 < t1) t2 = t1; t2 += b[ans[i]]; } printf("%d\n", t2); for (int i = 1; i <= n; i++) printf("%d ", ans[i]); } int main() { read(); solve(); return 0; }
2.(结构体+sort版本)
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <string> #include <cstring> using namespace std; int n, ans[10001]; struct node { int a, b, m, num; } train[10001]; bool cmp(node x, node y) { return x.m < y.m; } void read() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &train[i].a); for (int i = 1; i <= n; i++) scanf("%d", &train[i].b); } void solve() { for (int i = 1; i <= n; i++) { train[i].m = min(train[i].a, train[i].b); train[i].num = i; } sort(train + 1, train + n + 1, cmp); int k = 0, t = n + 1; for (int i = 1; i <= n; i++) { if (train[i].m == train[i].a) { ++k; ans[k] = i; } else { --t; ans[t] = i; } } int t1 = 0, t2 = 0; for (int i = 1; i <= n; i++) { t1 += train[ans[i]].a; if (t2 < t1) t2 = t1; t2 += train[ans[i]].b; } printf("%d\n", t2); for (int i = 1; i <= n; i++) printf("%d ", train[ans[i]].num); } int main() { read(); solve(); return 0; }
请问一本通内部的两个oj是不是质壁分离了??
https://loj.ac(https://loj.ac/submission/478220)
http://ybt.ssoier.cn:8088/statusx.php?runidx=3734616
QAQ请告诉我错在哪里谢谢