codeforces1119B. Alyona and a Narrow Fridge 贪心

神奇的传送门

现在给了一个冰箱,有两格宽,H格高,还有N瓶牛奶,每个牛奶都有一个高度,求最多能放进前几个瓶子


二分枚举,贪心验证。当前这些瓶子中,最高的能放下,这组序列才有可能放下。
二分枚举前n个瓶子,将前n个瓶子降序排列,选取两个之间最高的,判断这组是否能合法加入。


#include <stdio.h>
#include <climits>
#include <cstring>
#include <time.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <vector>
#include <string>

#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return

#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;

int N,H;
vector<int> bottle;
bool judge(int mid);
inline bool cmp(const int &a,const int &b);
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int temp;
    cin>>N>>H;
    rep(i,0,N){
        cin>>temp;
        bottle.Push(temp);
    }

    int inf=0,sup=N+1;
    while(inf+1<sup){
        int mid=inf+(sup-inf)/2;

        if(judge(mid)){
            inf=mid;
        }else{
            sup=mid;
        }
    }
    cout<<inf<<endl;

    re 0;
}
bool judge(int mid){
    vector<int> store(bottle.begin(),bottle.begin()+mid);
    sort(store.begin(),store.end(),cmp);

    ll height=0;
    for(register int i=0;i<store.size();i+=2){
        height+=store[i];
        if(height>H)
            re false;
    }

    re true;
}
inline bool cmp(const int &a,const int &b){
    re a>b;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值