zoukankan      html  css  js  c++  java
  • 贪心大解析

    1425:加工生产调度

    某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。

    某个产品 i 在 A,B 两车间加工的时间分别为Ai,Bi。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。

    这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。

    【输入样例】

    5
    3 5 8 7 10
    6 2 1 4 9

    【输出样例】

    34
    1 5 4 2 3
    样例解析:

    5     1 2 3 4 5
    A: 3 5 8 7 10
    B: 6 2 1 4 9
    min:3 2 1 4 9
    A B B B B
    A从小到大,B从大 到小
    顺序1 5 4 2 3
    按照如下规则排列:A小的从小到大排列,B小的从大到小排列(直观的解释就是A小的排前面,B机器等待的时间就少;B小的排在最后,A机器的等待时间就少)A + B排列方式。

     可以看到加工完这5个产品的时间是34.

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 10010;
    int n, a[N], b[N], m[N], ans[N], s[N];
    
    int main()
    {
        cin >> n;
        for(int i = 0; i < n; i ++) cin >> a[i];
        for(int i = 0; i < n; i ++) cin >> b[i];
        for(int i = 0; i < n; i ++) m[i] = min(a[i], b[i]), s[i] = i;
        for(int i = 0; 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 = 0; i < n; i ++)
            if(m[i] == a[s[i]]) ans[k ++] = s[i];
            else ans[t --] = s[i];
        k = 0, t = 0;
        for(int i = 0; i < n; i ++)
        {
            k += a[ans[i]];
            if(t < k) t = k;
            t += b[ans[i]];
        }
        cout << t << endl;
        for(int i = 0; i < n; i ++)
            cout << ans[i] + 1 << ' ';
    }

    「一本通 1.1 例 5」智力大冲浪

    小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的。接下来主持人宣布了比赛规则: 首先,比赛时间分为n个时段(n≤500),它又给出了很多小游戏,每个小游戏都必须在规定期限ti前完成(1≤ti≤n)。如果一个游戏没能在规定期限前完成,则要从奖励费m元中扣去一部分钱wi,wi为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个时段内完成,而且都必须从整时段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱! 注意:比赛绝对不会让参赛者赔钱!

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 510;
    int m, n, res, t[N], w[N], f[N];
    
    int main()
    {
        cin >> m >> n;
        for(int i = 1; i <= n; i ++) cin >> t[i];
        for(int i = 1; i <= n; i ++) cin >> w[i];
        for(int i = 1; i <= n - 1; i ++)
            for(int j = i + 1; j <= n; j ++)
                if(w[i] < w[j]) swap(w[i], w[j]), swap(t[i], t[j]);
        for(int i = 1; i <= n; i ++)
        {
            int j = 0;
            for(j = t[i]; j >= 1; j --)
                if(f[j] == 0) { f[j] = 1; break; }
            if(j == 0) res += w[i];
        }
        cout << m - res << endl;
    }
  • 相关阅读:
    Azkaban的使用
    Azkaban安装
    Kafka 启动失败,报错Corrupt index found以及org.apache.kafka.common.protocol.types.SchemaException: Error reading field 'version': java.nio.BufferUnderflowException
    Kafka 消费者设置分区策略及原理
    Kafka利用Java API自定义生产者,消费者,拦截器,分区器等组件
    zookeeper群起总是有那么几个节点起不来的问题解决
    flume 启动agent报No appenders could be found for logger的解决
    Flume 的监控方式
    Flume 自定义 组件
    Source r1 has been removed due to an error during configuration java.lang.IllegalArgumentException: Required parameter bind must exist and may not be null & 端口无法连接
  • 原文地址:https://www.cnblogs.com/longxue1991/p/15103304.html
Copyright © 2011-2022 走看看