版权声明:沃斯里德小浩浩啊 https://blog.csdn.net/Healer66/article/details/82918017
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6000
题意:
去洗衣店洗衣,带了L件衣服,洗衣店N个洗衣机,M个烘干机,每个洗衣机有独立的洗衣时间,烘干机也是,问你洗完所有衣服的最短时间。
思路:
见代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
const int INF =0x3f3f3f3f;
typedef long long ll;
struct Node
{
ll a,b;
bool friend operator <(Node x,Node y)
{
return x.a>y.a;
}
} node;
ll a[maxn];
priority_queue<Node>q1,q2;
int main()
{
int t,l,n,m;
int cnt=1;
ll ans;
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
ans=0;
while(!q1.empty())
q1.pop();
while(!q2.empty())
q2.pop();
cin>>l>>n>>m;
for(int i=0; i<n; i++)
{
cin>>node.a;
node.b=node.a;
q1.push(node);
}
for(int i=0; i<m; i++)
{
cin>>node.a;
node.b=node.a;
q2.push(node);
}
for(int i=0; i<l; i++)//a数组记录l件衣服洗完的时间
{
node=q1.top();
a[i]=node.a;
node.a+=node.b;
q1.pop();
q1.push(node);
}
for(int i=l-1; i>=0; i--)//最晚洗完的衣服用最快的烘干机即最大加最小
{ //如果按照常规思路,最早洗完的最快烘干,那么最后就是最晚出来的用最慢的烘干了。
node = q2.top();
ans=max(ans,node.a+a[i]);
node.a+=node.b;
q2.pop();
q2.push(node);
}
printf("Case #%d: %lld\n",cnt++,ans);
}
return 0;
}