Wash(HDU_6000,优先队列+贪心)
Posted sykline
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wash(HDU_6000,优先队列+贪心)相关的知识,希望对你有一定的参考价值。
传送门:Wash!!
题意:
有L件衣服要洗,有N台洗衣机,M台烘干机,给出了每台机器完成一件衣服的工作时间(每台机器同时只能完成一件衣服),问怎么选择机器才能使得总的工作时间是最短的。
思路:
用两个优先队列,一个表示洗衣机,一个表示烘干机。先让洗衣机进行工作,最后一件洗出来的衣服对应着结束的清洗工作时间是最长的,令这个时间加上最短的烘干时间。对应最终烘干结束的时间是最短的。同样倒数第二件也是这种情况,以此类推,,,,,,
即最长的时间加最短时间,一直加到最后这样最终的结果是最小的。如果令最长的洗衣时间加上最长的烘干时间,最后的总的结束时间一定要比最长的洗衣时间加上最短的烘干时间要长,不是最优解。
PS:
注意数据范围!!
代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e7+10; typedef long long ll; struct node { ll x;//工作时间 ll en;//工作到目前为止的结束时间 friend bool operator<(node a,node b) { return a.en > b.en; } } tmp; priority_queue<node> wash; priority_queue<node> dry; int l,n,m; ll a[maxn]; int main() { int T,cnt = 1; scanf("%d",&T); while(T--) { while(!wash.empty()) wash.pop(); while(!dry.empty())dry.pop(); scanf("%d%d%d",&l,&n,&m); for(int i = 0; i<n; i++) { scanf("%lld",&tmp.x); tmp.en = tmp.x; wash.push(tmp); } for(int i = 0; i<m; i++) { scanf("%lld",&tmp.x); tmp.en = tmp.x; dry.push(tmp); } for(int i = 0; i<l; i++) { tmp = wash.top();//取出最短工作时间的机器来洗衣服 a[i] = tmp.en; tmp.en += tmp.x;//结束时间加一段工作时间 wash.pop(); wash.push(tmp);//工作结束后投入等待序列 } ll ans = 0; for(int i=l-1; i>=0; i--) { tmp = dry.top(); ans = max(ans, a[i]+tmp.en);//更新洗衣服的结束时间 tmp.en += tmp.x; dry.pop(); dry.push(tmp); } printf("Case #%d: %lld ",cnt++,ans); } return 0; } /* 样例输入: 2 1 1 1 1200 34 2 3 2 100 10 1 10 10 样例输出: Case #1: 1234 Case #2: 12 */
以上是关于Wash(HDU_6000,优先队列+贪心)的主要内容,如果未能解决你的问题,请参考以下文章
hdu6000 Wash ccpc-20162017-finals B Wash