USCAO Job Processing 4.2(贪心,不知道叫啥方法)

题意:A,B两种机器数量m,n,且知道每个机器加工一件产品的用时,B机器加工的产品必须要A先加工过的,那么求s个产品,所需的A,B最加工完成的时间。

A的时间比较好求,每次选择开始时间+加工时间最小的,然后当前开始时间增加。用priority_queue比较方便实现,同时按产品加工完先后顺序记录时间acost[s];

B的比较巧妙,同样按A的方法得到bcost[s],然后反过来求bcost[s-i+1]+acost[i]的最大值即时最快完成B的时间。这个好好理解下。

/*

ID: hubiao cave

PROG: job

LANG: C++

*/




#include<iostream>

#include<fstream>
#include<algorithm>
#include<string>
#include<queue>
#include<functional>
using namespace std;



int main()

{


    ifstream fin("job.in");

    ofstream fout("job.out");
    int n,a,b;
    int at,bt;
    int acost[1002]={0};
    int bcost[1002]={0};
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >pq;
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >bpq;
    fin>>n>>a>>b;

    for(int i=0;i<a;i++)
    {
        int m;
        fin>>m;
        pq.push(make_pair(m,m));
    }
    for(int i=0;i<b;i++)
    {
        int m;
        fin>>m;
        pq.push(make_pair(m,m));
    }

    for(int i=1;i<n;i++)
    {
        pair<int,int> mini=pq.top();
        acost[i]=mini.first;
        mini.first+=mini.second;
        pq.pop();
        pq.push(mini);
    }
    
    at=pq.top().first;
    acost[n]=at;


    for(int i=1;i<n;i++)
    {
        pair<int,int> mini=bpq.top();
        bcost[i]=mini.first;
        mini.first+=mini.second;
        bpq.pop();
        bpq.push(mini);
    }
    bcost[n]=bpq.top().first;
    bt=0;
    for(int i=1;i<=n;i++)
    {
        if(acost[i]+bcost[n-i+1]>bt)
            bt=acost[i]+bcost[n-i+1];
    }
    fout<<at<<" "<<bt<<endl;
    return 0;


}

 

posted @ 2013-12-13 22:33  cavehubiao  阅读(275)  评论(0)    收藏  举报