題目鏈接:BZOJ : https://www.lydsy.com/JudgeOnline/problem.php?id=5088
Hdu : http://acm.hdu.edu.cn/showproblem.php?pid=6000
題目描述
你現在要洗L件衣服。你有n臺洗衣機和m臺烘乾機。由於你的機器非常的小,因此你每次只能洗滌(烘乾)一件衣服。
第i臺洗衣機洗一件衣服需要wi分鐘,第i臺烘乾機烘乾一件衣服需要di分鐘。請問把所有衣服洗乾淨並烘乾,最少需要多少時間?假設衣服在機器間轉移不需要時間,並且洗完的衣服可以過一會再烘乾。
輸入
輸入第一行有3個整數L,n和m。第二行有n個整數w1,w2,...,wn。第三行有m個整數d1,d2,...,dm。
輸出
輸出一行一個整數,表示所需的最少時間。
樣例輸入
1 1 1 1200 34
樣例輸出
1234
提示
題意:中文題意不多BB;但是這個真的是沒想到竟然可以這樣貪心,可以這樣玩。就是考慮洗衣機,每次最早在啥時候用,先對洗衣機排個序,然後每次選出來一個,然後記錄下時間,再把當前洗衣機加上運行的時間放進去,考慮下次用到這個洗衣服的最早時間。就這樣選出來 l 個就就好了。對於烘乾的話,倒着考慮,就是最後一個往前每一個都儘量少的時間,因爲考慮一種情況假如洗的很快但是卻烘乾的很慢也是等着。所以從後往前的時候考慮烘乾最快,這樣就可以減少結束的時間,不懂的話自己模擬下多道程序進行,要的時間肯定是所有任務都結束的時間,所以儘可能讓最後結束的那個時間短點,最後的時間等於max某個點的結束時間。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005];
int b[100005];
ll Atime[1000005];
struct node{
ll delin;
int id;
};
bool operator <(node a,node b)
{
return a.delin > b.delin;
}
int main()
{
priority_queue<node> q1,q2;
int L,n,m;
scanf("%d%d%d",&L,&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);
for(int i=0;i<n;i++)
{
node temp;
temp.id=i;
temp.delin=a[i];
q1.push(temp);
}
for(int i=0;i<m;i++)
{
node temp;
temp.id=i;
temp.delin=b[i];
q2.push(temp);
}
for(int i=0;i<L;i++)//求出來L件衣服最少洗衣服的時間
{
node temp=q1.top();
q1.pop();
Atime[i]=temp.delin;
temp.delin=temp.delin+a[temp.id];
q1.push(temp);
}
ll ans=0;
for(int i=L-1;i>=0;i--)//從後往前 烘乾機時間從小到大
{
node temp=q2.top();
q2.pop();
ans=max(ans,Atime[i]+temp.delin);
temp.delin=temp.delin+b[temp.id];
q2.push(temp);
}
printf("%lld\n",ans);
return 0;
}