记录一个菜逼的成长。。
二分缓冲区k的大小,用优先队列模拟,不断记录满足条件的最小值
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn = 100000 + 10;
int a[maxn];
LL check(int k,int n)
{
priority_queue<int>q;
LL ret = 0;
int ind = 1,cnt = 1;
while(!q.empty() || ind <= n){
while(q.size() < k && ind <= n)q.push(a[ind++]);
ret += cnt++*q.top();q.pop();
}
return ret;
}
int main()
{
int n;LL Q;
while(~scanf("%d%lld",&n,&Q)){
for( int i = 1; i <= n; i++ )
scanf("%d",a+i);
int l = 1,r = n,ans = 0;
while(l <= r){
int mid = (l + r) >> 1;
LL ret = check(mid,n);
if(ret <= Q){
ans = mid;
r = mid - 1;
}
else l = mid + 1;
}
printf("%d\n",ans);
}
return 0;
}