现在给了一个冰箱,有两格宽,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;
}