题意:有n堆衣服,有m个洗衣机,每个洗衣机洗一堆衣服需要wi 时间, 又有 k 个烘干机, 每个烘干机洗一堆衣服需要
di 时间,问最快需要多少时间将n堆衣服全部烘干。
做法:一看这种类型就往贪心上面想,但自己愚蠢的把贪心策略想错了,刚开始想的时洗的最快加烘的最快就是答案。
显然错了,这只是一堆的情况,这堆很快但其他堆反而更慢了。
后来问了陈聚聚,正解: 对于每一堆衣服 如果洗衣服需要时间少就加上一个大的烘干时间,如果洗衣服时间久那么就加一个烘干时间少的,然后在所有衣服中取最大值就是答案。 先用优先队列跑一边每一堆最快洗衣时间,再跑一边烘干最快时间,让两个值反向相加 比如: w[1]+d[n] ;
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> using namespace std; typedef long long ll; struct node { ll cost; ll time; bool friend operator < (const node a,const node b) { return a.time>b.time; } }; int n,m,k; ll time[1000005]; int main() { int T,kiss=1; scanf("%d",&T); while(T--) { struct node u; priority_queue<node> w,d; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;++i) { scanf("%lld",&u.cost); u.time=u.cost; w.push(u); } for(int i=1;i<=k;++i) { scanf("%lld",&u.cost); u.time=u.cost; d.push(u); } ll ans=0; for(int i=1;i<=n;++i) { u=w.top(); w.pop(); time[i]=u.time; u.time=u.cost+u.time; w.push(u); } for(int i=n;i>=1;--i) { u=d.top(); d.pop(); if(time[i]+u.time>ans) ans=time[i]+u.time; u.time=u.cost+u.time; d.push(u); } printf("Case #%d: %lld\n",kiss++,ans); } return 0; } //每台洗衣机的工作时间是独立的可以先预处理出每件衣服洗完的时间 //然后用贪心的想法把最后洗完的衣服安排给最早烘干的