6000(Wash)
阿新 • • 發佈:2018-12-13
題意:
有n件衣服,有m1 個洗衣機,m2 個烘乾機,給出每個洗衣機洗一件衣服的工作時間,和每個烘乾機烘乾一件衣服的的工作時間, 每個機器在一個時間段只能處理一件衣服,問洗完並烘乾這n件衣服最短時間是多少。
題解:
使用兩個優先佇列記錄每臺機器總的工作時間,通過貪心的思想最先洗完的衣服用較慢的烘乾機,後洗完的衣服用較快的烘乾機。
#include<bits/stdc++.h> #define maxn 1000100 typedef long long int ll; using namespace std; struct node { ll x,base; bool operator >(const node a)const { return x>a.x; } }edg[maxn]; ll a[maxn]; priority_queue<node,vector<node>,greater<node> > q1; priority_queue<node,vector<node>,greater<node> > q2; int main() { int T,n,m1,m2; ll x; node ed; scanf("%d",&T); for(int Case=1;Case<=T;Case++) { while(!q1.empty()) q1.pop(); while(!q2.empty()) q2.pop(); scanf("%d%d%d",&n,&m1,&m2); for(int i=0;i<m1;i++) { scanf("%lld",&x); ed.x=ed.base=x; q1.push(ed); } for(int i=0;i<m2;i++) { scanf("%lld",&x); ed.x=ed.base=x; q2.push(ed); } ll sum=0; for(int i=0;i<n;i++) { ed=q1.top(); q1.pop(); a[i]=ed.x;//每臺洗衣機工作時間 ed.x+=ed.base; q1.push(ed); } for(int i=n-1;i>=0;i--) { ed=q2.top(); q2.pop(); sum=max(sum,a[i]+ed.x); ed.x+=ed.base; q2.push(ed); } printf("Case #%d: %lld\n",Case,sum); } return 0; }