P1248 加工生产调度-贪心

  • P1248 加工生产调度
  • 题意:某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。
  • 这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。
  • 思路:构造C数组c[i]为取a[i],b[i]小的时间,小-大排序,然后构造加工顺序,根据排完序的数组C判断 一下当前值是
  • A还是B如果是A则从前往后放,是B则从后往前放。最后模拟一遍加工过程,计算时间即可。
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 1234
    int n,t,a[maxn],ans[maxn];
    int b[maxn],head,tail;
    struct node
    {
        int w,id;
        bool operator<(const node&x)const
        {
            return w<x.w;
        }
    } c[maxn];
    int main()
    {
        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]);
            c[i].w=min(b[i],a[i]);
            c[i].id=i;
        }
        sort(c+1,c+1+n);
        tail=n+1;
        head=0;
        for(int i=1; i<=n; i++)
        {
            if(c[i].w==a[c[i].id])
                ans[++head]=c[i].id;
            else ans[--tail]=c[i].id;
        }
        head=tail=0;
        for(int i=1; i<=n; i++)
        {
            head+=a[ans[i]];
            if(head>tail)tail=head;
            tail+=b[ans[i]];
        }
        printf("%d\n",tail);
        for(int i=1; i<=n; i++)
        {
            printf("%d",ans[i]);
            if(i==n)printf("\n");
            else printf(" ");
        }
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/85078118