16.7.16 C 1744. 奶牛晒衣服

Description

  在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝。熊大妈决定给每个宝宝都穿上可爱的婴儿装。于是,为牛宝宝洗晒衣服就成了很不爽的事情。
  圣人王担负起了这个重任。洗完衣服后,你就要弄干衣服。衣服在自然条件下用1的时间可以晒干A点湿度。抠门的熊大妈买了1台烘衣机。使用烘衣机可以让你用1的时间使1件衣服除开自然晒干的A点湿度外,还可烘干B点湿度,但在1的时间内只能对1件衣服使用。
  N件衣服因为种种原因而不一样湿,现在告诉你每件衣服的湿度,要你求出弄干所有衣服的最少时间(湿度为0为干)。
Input

  第一行N,A,B;接下来N行,每行一个数,表示衣服的湿度(1<=湿度,A,B<=5000001<=N<=500000)。

Output

一行,最少时间。

Sample Input

3 2 1
1
2
3


Sample Output

1

解题思路:

首先看这道题的意思,我们可以很容易的得出每次选湿度最大的衣服去烘干更优,那么我们就可以用贪心的方法来做。比如样例我们都插入q1中,那么q1就为3 2 1,然后依次取出,第一个 -a-b ,其他的 -a,插入q2,这时q2就为0 0 -1,这是就满足题目要求,就把次数输出。(至于满足题目要求的判断可以用一个计数器,每次遇到一个新的<=0的就+1)
我们发现,每次 -a-b 的就只有第一个最大的数,而其他的都减了一个 a 。所以换句话说就是所有都减 a ,而第一个多减一个 b 。那么与其每个去减 a ,那还不如我们用一个变量sum每次 +a ,这样每次就只需要让堆的跟(也就是最大的那个) -b 就ok了,最后只需要比较最大的那个是否 <=sum ,如果成立,就表示全部都<=sum 了。这就大大提高了效率!
这道题目表示虐pascal的堆,c++表示有许多关于堆的自带函数,于是这道题目打得短,数组都没开!
Code (No Copy!仅供参考,若要给,请聘请)

#include<cstdio>
#include<cstring>
#include<queue>
#define F(i,x,y) for(int i=x;i<=y;i++)
#define d(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const int maxn=300050;
int n,a,b;
int x;
int ans=0;
priority_queue<int> f;
inline int read()
{
    int data = 0; 
    char ch = 0;
    while(ch<'0' || ch>'9') ch = getchar();
    while(ch >= '0' && ch <= '9') data = data * 10 + ch-'0',ch = getchar();
    return data;
}
void init()
{
    n = read(),a = read(),b = read();

    F(i,1,n)
    { 
       x = read();
       f.push(x);
    }
}
void getout()
{
    printf("%d\n",ans);
}
void work()
{
    int sum = 0;
    while(1)
    {
        if(sum >= f.top()) {getout();return ;}
        else
        {
            sum += a;
            int e = f.top();
            f.pop();
            e -= b;
            f.push(e);
            ans++;
        } 
    }
}
void check()
{
    F(i,1,n)
    {
        printf("%d\n",f.top());
        f.pop();
    }
}
int main()
{
    freopen("2.in","r",stdin);

    init();
//  check();
    work();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值