[堆] 奶牛晒衣服

惯例的传送门

思路

用一个堆去维护所有的衣服,每次取湿度最大的一件进行烘干,当最大的那一件也被烘干后便是答案。这个堆的作用就是保证heap[1]永远是最大的。
你也可以用sort进行排序,但是数据好大可能会超时。

上两份代码

第一份(常规写法)

/*
Author  : yukki
Time    : 2020.9.1
OJ      : luogu
Pid     : 1843
*/
#include <cstdio>
#include <algorithm>
#include <iostream>
#define  F1(i,n) for(i=1;i<=n;i++)
#define  F0(i,n) for(i=0;i<=n;i++)
#define _F1(i,n) for(i=n;i>=1;i--)
#define _F0(i,n) for(i=n;i>=0;i--)
using namespace std;
int n,a,b;
int t;
int heap[500050];
int len;
void up(int p)
{
    int pos = p;
    while(pos >> 1)
    {
        if(heap[pos>>1] < heap[pos])
        {
            int tmp;
            tmp = heap[pos];
            heap[pos] = heap[pos>>1];
            heap[pos>>1] = tmp;
            pos = pos>>1;
        }
        else break;
    }
}
void down(int p)
{
    int pos = p;
    while(pos<<1 <= len)
    {
        int tmp = pos<<1;
        if(tmp + 1 <= len && heap[tmp] < heap[tmp+1])tmp++;
        if(heap[pos] < heap[tmp])
        {
            int temp;
            temp = heap[pos];
            heap[pos] = heap[tmp];
            heap[tmp] = temp;
            pos = tmp;
        }
        else break;
    }
}
void push(int num)
{
    heap[++len] = num;
    up(len);
}
int main()
{
    register int i,j;
    scanf("%d",&n);
    scanf("%d",&a);
    scanf("%d",&b);
    len = 0;
    F1(i,n)
    {
        int tmp;
        scanf("%d",&tmp);
        push(tmp);
    }
    int times = 0;
    while(heap[1] > times * a)
    {
        times++;
        heap[1] -= b;
        down(1);
    }
    printf("%d\n",times);
    return 0;
}

第二份(类)

/*
Author  : yukki
Time    : 2020.9.1
OJ      : luogu
Pid     : 1843
*/
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int n,a,b;
class heap
{
    public:
    vector <int> vec;
    void init()
    {
        vec.push_back(0);
    }
    void up(int pos)
    {
        while(pos>>1)
        {
            if(vec[pos] > vec[pos>>1])
            {
                int tmp = vec[pos];
                vec[pos] = vec[pos>>1];
                vec[pos>>1] = tmp;
                pos = pos>>1;
            }
            else break;
        }
    }
    void down(int pos)
    {
        while(pos<<1 <= vec.size() - 1)
        {
            int p = pos << 1;
            if(vec[p+1] > vec[p] && p+1 <= vec.size()-1)p++;
            if(vec[p] > vec[pos])
            {
                int tmp = vec[p];
                vec[p] = vec[pos];
                vec[pos] = tmp;
                pos = p;
            }
            else break;
        }
    }
    void push(int num)
    {
        vec.push_back(num);
        up(vec.size()-1);
    }
    void print()
    {
        vector <int>::iterator it;
        for(it=vec.begin();it!=vec.end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
};
heap T;
int main()
{
    register int i,j;
    cin>>n>>a>>b;
    int times = 0;
    T.init();
    for(i=1;i<=n;i++)
    {
        int tmp;
        cin>>tmp;
        T.push(tmp);
        //T.print();
    }
    while(T.vec[1] > a*times)
    {
        times++;
        T.vec[1] -= b;
        T.down(1);
    }
    cout<<times<<endl;
    return 0;
}

后记

我不会类,瞎**写一写,真TM好玩。
其实这题用二分也能写,不想写了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值