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

6910: 洗衣服

时间限制: 2 Sec  内存限制: 128 MB
提交: 26  解决: 7
[提交] [状态] [讨论版] [命题人:admin]

 

题目描述

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

提示

 

来源/分类

中山纪念中学20170310 

[提交] [状态]

【总结】

好题,好神仙题,好神仙贪心题。

【分析】

按照贪心策略,把每一个洗衣机都压入优先队列,压入的权值代表:如果我要用这个洗衣机,最早将在什么时刻洗完一件衣服。

很明显,如果我用某个洗衣机洗过一次,那么其他衣服想用它的话,需要总共w[i]*2的时间洗完。

 

烘干的话,我们想要最晚烘干的那件衣服尽量早,所以我们让最晚洗完的那件衣服,先烘干(不要等了,这最晚洗完的要是等,肯定会拖延总时间)

以此贪心,解题。。

【代码】

/****
***author: winter2121
****/
#include<bits/stdc++.h>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define SI(i) scanf("%d",&i)
#define PI(i) printf("%d\n",i)
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int MAX=2e5+5;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
int dir[9][2]={0,1,0,-1,1,0,-1,0, -1,-1,-1,1,1,-1,1,1};
template<class T>bool gmax(T &a,T b){return a<b?a=b,1:0;}
template<class T>bool gmin(T &a,T b){return a>b?a=b,1:0;}
template<class T>void gmod(T &a,T b){a=(a%mod+b)%mod;}

typedef pair<ll,int>PII;
priority_queue<PII,vector<PII>,greater<PII> >q1,q2;

int L,n,m;
ll tim[MAX*5],w[MAX],d[MAX];
int main()
{
    scanf("%d%d%d",&L,&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&w[i]);
        q1.push(PII(w[i],i)); //装一个洗衣机,表示用了这个洗衣机,等待w[i]时间会洗完
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%lld",&d[i]);
        q2.push(PII(d[i],i)); //装一个烘干机,同上
    }
    for(int i=0;i<L;i++)//洗衣服
    {
        PII u=q1.top(); q1.pop();
        tim[i]=u.first; //最快洗完这个衣服的时间
        u.first+=w[u.second];
        q1.push(u);
    }
    ll ans=0;
    for(int i=L-1;i>=0;i--) //让最晚洗完的衣服,尽早的烘干,才能保证最长的那个时间尽量短
    {
        PII u=q2.top(); q2.pop();
        tim[i]+=u.first;
        u.first+=d[u.second];
        q2.push(u);
        ans=max(ans,tim[i]); //取一个花费时间最长的
    }
    printf("%lld\n",ans);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪的期许

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值