Bzoj 5088 HDU 6000 Upc6910 Wash(洗衣服)這輩子都學不會的貪心+優先隊列

題目鏈接: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;
}

 

發佈了157 篇原創文章 · 獲贊 18 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章