题意: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; }