原题链接:
HDU-6000
大意:
有 L 件衣服,M 个洗衣机,N 个烘干机。
洗衣机烘干机的工作时间分别为 Mi , Ni .求最短时间洗完所有衣服。
思路:
用队列维护洗衣服的时间,每洗一件衣服增加自身的时间。
显而易见洗衣服按照大小顺序来,要使总时间最小,那么最先洗完的衣服用较慢的烘干机,后洗完的衣服用较快的烘干机。
具体实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
#define pb push_back
#define pair <int,int> pii
//#define LOCAL
const int MAXN =1e6+10;
ll l,n,m;
ll t[MAXN];
struct node{
ll val,base;
node(ll _v=0,ll _b=0):val(_v),base(_b){}
bool operator <(const node &x)const{return val>x.val;}
};
priority_queue<node> wash,dry;
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T;
scanf("%d",&T);
int kase=0;
while(T--){
mem(t,0);
while(!wash.empty()) wash.pop();
while(!dry.empty()) dry.pop();
scanf("%lld%lld%lld",&l,&n,&m);
for(int i=0;i<n;i++){
ll x;
scanf("%lld",&x);
wash.push(node(x,x));
}
for(int i=0;i<m;i++){
ll x;
scanf("%lld",&x);
dry.push(node(x,x));
}
for(int i=0;i<l;i++){
node u=wash.top();wash.pop();
t[i]=u.val;
u.val+=u.base;
wash.push(u);
}
ll ans=0;
//t_i 一定是按大小顺序的 从t_i的意义理解
for(int i=l-1;i>=0;i--){
node u=dry.top();dry.pop();
ans=max(ans,t[i]+u.val);
u.val+=u.base;
dry.push(u);
}
printf("Case #%d: %lld\n",++kase,ans);
}
return 0;
}