【2016 CCPC-Final】B

来源:互联网 发布:临沂知豆电动汽车销售 编辑:程序博客网 时间:2024/06/06 10:40

https://vjudge.net/problem/Gym-101206B

L件衣服, n 个洗衣机, m 个烘干机, 给定每台洗衣机洗衣服的时间和每台烘干机烘干的时间, 每台机器一个时间段只能处理一件衣服。
求洗完L件衣服的最短时间?

使用priority_queue
先使用优先队列算出第i件衣服洗完的最短时间,
若要使洗+烘干的总时间最短,则最晚洗完的衣服应放到最快的烘干机中,
按照该原则依次更新答案。

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <queue>#include <algorithm>using namespace std;int t,l,n,m;long long a[1000005];long long ans;struct Node{    long long Cost,Next;    friend bool operator <(Node a,Node b){        return a.Next > b.Next;    }};priority_queue <Node> q;int main(){    scanf("%d",&t);    for (int k=1;k<=t;k++){        ans=0;        scanf("%d%d%d",&l,&n,&m);        Node tmp;        long long x;        while (!q.empty()) q.pop();        for (int i=0;i<n;i++){            scanf("%lld",&x);            tmp.Cost=tmp.Next=x;            q.push(tmp);        }        for (int i=0;i<l;i++){            tmp=q.top();            q.pop();            a[i]=tmp.Next;            tmp.Next+=tmp.Cost;            q.push(tmp);        }        while (!q.empty()) q.pop();        for (int i=0;i<m;i++){            scanf("%lld",&x);            tmp.Cost=tmp.Next=x;            q.push(tmp);        }        for (int i=l-1;i>=0;i--){     //注意循环顺序            tmp=q.top();            q.pop();            ans=max(ans,a[i]+tmp.Next);            tmp.Next+=tmp.Cost;            q.push(tmp);        }        printf("Case #%d: %lld\n",k,ans);    }}
原创粉丝点击