1. 程式人生 > >中山紀念中學20170310洗衣服(貪心,優先隊列升序【pair】)

中山紀念中學20170310洗衣服(貪心,優先隊列升序【pair】)

long spa tor i++ 再次 記錄 當前 優先 mil

#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,int>clot;
priority_queue<clot,vector<clot>,greater<clot> >wash,dry;//升序隊列
int l,n,m;
long long ans=0;
long long tim[1000010],w[100010],d[100010];//tim記錄衣服的經過從洗衣機到烘幹機拿出的時間之和,最晚放進烘幹機那批衣服裏時間之和最長的即為ans
int main()
{
scanf("%d%d%d",&l,&n,&m);


for(int i=1;i<=n;i++)
{
scanf("%lld",&w[i]);
wash.push(clot(w[i],i));//將洗衣機的數據放入優先隊列
}
for(int i=1;i<=m;i++)
{
scanf("%lld",&d[i]);
dry.push(clot(d[i],i));//將烘幹機的數據放入優先隊列
}
for(int i=0;i<l;i++)
{
clot tmp=wash.top();//取工作最快的洗衣機
wash.pop();

tim[i]=tmp.first;//當前已經工作完成的最快的洗衣機
tmp.first+=w[tmp.second];//記錄時間累加,這臺洗衣機累計的工作時間
wash.push(tmp);//再次放入隊列讓它工作
}
for(int i=l-1;i>=0;i--)//最晚洗完的衣服放到最快的烘幹機裏,否則會很慢,此處貪心
{
clot tmp=dry.top();//取工作最快的烘幹機
dry.pop();
tim[i]+=tmp.first;//當前已經工作完成的最快的烘幹機
tmp.first+=d[tmp.second];//記錄時間累加,這臺烘幹機累計的工作時間

dry.push(tmp);//再次放入隊列讓它工作
ans=max(ans,tim[i]);//取一個花費時間最長的,木桶效應,有的衣服可能洗完得早放進了工作時間長的烘幹機裏導致時間之和更長
}
printf("%lld\n",ans);
return 0;
}

中山紀念中學20170310洗衣服(貪心,優先隊列升序【pair】)