1 条题解

  • 0
    @ 2023-3-29 20:31:50

    贪心

    一个很直白的排序方法是:A生产线快的先做,B生产线快的后做

    理由是什么呢:

    • ①我们先放在生产线A,再放到生产线B,A生产线时间是不论怎样都是不变的,因此我们只需让B生产线早点开始早点结束
    • ②B生产线早点开始,意思就是A生产线尽可能快的出产品,因此我们要把A生产线快的产品放到前面
    • ③B生产线早点结束,我们只需要让A出来的产品不要排队等待进入B产品,因此我们要把B生产线快的产品放到后面

    这是定性的证明,定量的证明参见

    本题难点无非就是cmp函数的编写,可知排序不仅仅和最小值有关,还跟最小值出现的位置有关,这在我们的结构体中需要一个变量来存放,然后分类讨论即可

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1005;
    
    int n;
    
    struct Node
    {
        int a;
        int b;
        int id;
        int tmin;
        int d;
        bool operator < (const Node &x)const
        {
            if(d == x.d)
            {
                if(d<=0) return a<x.a;
                else return b>x.b;
            }
            return d<x.d;
        }
    }ob[N];
    
    
    int main()
    {
        cin >> n;
        for(int i=1;i<=n;i++)
        {
            ob[i].id = i;
            cin >> ob[i].a;
        }
        for(int i=1;i<=n;i++)
        {
            cin >> ob[i].b;
            ob[i].tmin = min(ob[i].a,ob[i].b);
            if(ob[i].a<ob[i].b) ob[i].d = -1;
            else if(ob[i].a == ob[i].b) ob[i].d = 0;
            else ob[i].d = 1;
        }
        sort(ob+1,ob+n+1);
        int fa = 0,fb = 0;
        for(int i = 1;i<=n;i++)
        {
            fa+=ob[i].a;
            fb = max(fb,fa);
            fb+=ob[i].b;
        }
        cout << fb << endl;
        for(int i=1;i<n;i++)
        {
            cout << ob[i].id << " ";
        }
        cout << ob[n].id;
        return 0;
    }
    
    • 1

    「一本通 1.1 例 4」加工生产调度

    信息

    ID
    497
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    42
    已通过
    23
    上传者