upc 6910 洗衣服(贪心 优先队列)

题目描述

你现在要洗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

输出一行一个整数,表示所需的最少时间。

 

样例输入

1 1 1
1200
34

 

样例输出

1234

来源/分类

中山纪念中学20170310 

 

【总结】

我自认为这道题属于一眼看上去就很简单但是仔细想又不是特别好想的题  要求的是最小时间 基本上都能想到贪心 用优先队列处理  比较难想到的是洗完衣服之后烘干的过程 这个时候(用我BF的一句话)我们要纵观全局,看到整个时间轴。我们想让时间最短,就要让最后一件洗完的衣服尽可能早的出来,所以它必须用最快的烘干机!!!这是重点  以此类推 倒数第二件出来的衣服用第二快的烘干机 (这里的第二快不一定是时间排行第二,因为有可能第一个烘干机烘三遍比第二个烘干机烘一遍都快,每当优先队列的首元素出队列时 都得让它再加上一倍的时间继续入队列)

 

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+3;
ll t[maxn];//记录每件衣服洗完的时间
ll n[maxn],m[maxn];
typedef pair<ll,ll> P;
int main()
{
    priority_queue<P,vector<P>,greater<P> >q1;
    priority_queue<P,vector<P>,greater<P> >q2;
    ll l,nn,mm;
    cin>>l>>nn>>mm;
    for(int i=1;i<=nn;i++)
    {
        cin>>n[i];//xi
        q1.push(make_pair(n[i],i));
    }
    for(int i=1;i<=mm;i++)
        {
            cin>>m[i];//hong
            q2.push(make_pair(m[i],i));
        }
    for(int k=1;k<=l;k++)
    {
        P a=q1.top();
        q1.pop();
        t[k]=a.first;
        int b=a.second;
        q1.push(make_pair(t[k]+n[b],b));
    }
    ll ans=0;
    for(int k=l;k;k--)
    {
        P a=q2.top();
        q2.pop();
        t[k]+=a.first;
        int b=a.second;
        q2.push(make_pair(a.first+m[b],b));
        ans=max(ans,t[k]);
    }
    printf("%lld\n",ans);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值