zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", 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请告诉我错在哪里谢谢

  • 相关阅读:
    IIS7 配置PHP服务器
    WebAPI Post请求多参数处理方案
    Mssql 跨域查询
    sql 给数据库表 字段 添加注释
    log4net配置文件
    搭建svn服务器小结
    Django测试开发-30- xadmin模板中class Meta:和def __str__(self):的应用
    Django测试开发-29- xadmin模板中详情页面布局form_layout详解
    Django测试开发-28- xadmin模板中related_name和_set()用法
    Django测试开发-27- xadmin模板中注册增加Student和Teacher,Card及CardDetail表
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10986817.html
Copyright © 2011-2022 走看看