1. 程式人生 > >Wash(HDU_6000,優先隊列+貪心)

Wash(HDU_6000,優先隊列+貪心)

機器 nbsp href opera 時間 情況 per spa operator

傳送門: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\n",cnt++,ans); } return 0; } /* 樣例輸入: 2 1 1 1 1200 34 2 3 2 100 10 1 10 10 樣例輸出: Case #1: 1234 Case #2: 12 */
View Code

Wash(HDU_6000,優先隊列+貪心)