p2751 Job Processing
如果单单只安排过程1的时间最短,很容易算出来。用优先队列取最小,加上增量后再放回就行。对过程2也进行这样的操作。将过程1第一个完成的在过程2最后一个完成。以样例来说,过程1:1,1,2,2,3,过程2:1,2,3,3,4。那么小的和大的组合用时最少。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #include <bitset> #define mkp make_pair using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=1030,INF=0x7FFFFFFF,mod=9901; int inc[SZ]; struct nd{ int val,id; nd(int a,int b):val(a),id(b){} bool operator<(const nd &rbs)const { return val>rbs.val; } }; struct nnd{ int val,id; nnd(int a,int b):val(a),id(b){} bool operator<(const nnd &rbs)const { return val>rbs.val; } }; int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { int n,num1,num2; cin>>n>>num1>>num2; priority_queue<nd> pq1; priority_queue<nnd> pq2; for(int i=1;i<=num1+num2;++i) { cin>>inc[i]; if(i<=num1) { pq1.push(nd(inc[i],i)); } else pq2.push(nnd(inc[i],i)); } vector<int> res1,res2; for(int i=0;i<n;++i) { nd tmp=pq1.top(); res1.push_back(tmp.val); pq1.pop(); tmp.val+=inc[tmp.id]; pq1.push(tmp); } for(int i=0;i<n;++i) { nnd tmp=pq2.top(); res2.push_back(tmp.val); pq2.pop(); tmp.val+=inc[tmp.id]; pq2.push(tmp); } sort(res1.begin(),res1.end()); sort(res2.begin(),res2.end()); cout<<res1[res1.size()-1]<<" "; int maxv=0; for(int i=0;i<res1.size();++i) { maxv=max(maxv,res1[i]+res2[res1.size()-i-1]); } cout<<maxv<<endl; } return 0; }
浙公网安备 33010602011771号