https://codeforces.com/contest/1119/problem/B
不改变原数组的值,复制一份,要求1-k连续,则1-mid区间内判断
子数组从大到小排序后,每两个相差不大,比较均匀 i+=2
倒着的目的是前大后小 能装前一定能装后 尽量装更多的 累积高度和
跳着累积高度和,如果<=h 可增加更多的瓶子,否则高度太多瓶子太多,减小瓶子数量
const int maxn=1005;
int a[maxn],b[maxn];
int n;
ll h;
bool check(int mid)
{
ll sum=0;
for(int i=1;i<=mid;i++)
{
b[i]=a[i];
}
sort(b+1,b+mid+1);
reverse(b+1,b+mid+1);
for(int i=1;i<=mid;i+=2)
{
sum+=b[i];
}
return sum<=h;
}
int main()
{
IO;
cin>>n>>h;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int l=1,r=n,mid=0,ans=0;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
cout<<ans<<endl;
return 0;
}