https://vjudge.net/problem/Gym-101206B
L件衣服, n 个洗衣机, m 个烘干机, 给定每台洗衣机洗衣服的时间和每台烘干机烘干的时间, 每台机器一个时间段只能处理一件衣服。
求洗完L件衣服的最短时间?
使用priority_queue
先使用优先队列算出第i件衣服洗完的最短时间,
若要使洗+烘干的总时间最短,则最晚洗完的衣服应放到最快的烘干机中,
按照该原则依次更新答案。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int t,l,n,m;
long long a[1000005];
long long ans;
struct Node{
long long Cost,Next;
friend bool operator <(Node a,Node b){
return a.Next > b.Next;
}
};
priority_queue <Node> q;
int main(){
scanf("%d",&t);
for (int k=1;k<=t;k++){
ans=0;
scanf("%d%d%d",&l,&n,&m);
Node tmp;
long long x;
while (!q.empty()) q.pop();
for (int i=0;i<n;i++){
scanf("%lld",&x);
tmp.Cost=tmp.Next=x;
q.push(tmp);
}
for (int i=0;i<l;i++){
tmp=q.top();
q.pop();
a[i]=tmp.Next;
tmp.Next+=tmp.Cost;
q.push(tmp);
}
while (!q.empty()) q.pop();
for (int i=0;i<m;i++){
scanf("%lld",&x);
tmp.Cost=tmp.Next=x;
q.push(tmp);
}
for (int i=l-1;i>=0;i--){ //注意循环顺序
tmp=q.top();
q.pop();
ans=max(ans,a[i]+tmp.Next);
tmp.Next+=tmp.Cost;
q.push(tmp);
}
printf("Case #%d: %lld\n",k,ans);
}
}