解题思路
将 升序排序,最优选择可取为连续区间 ,代价为:
维护前缀最优长度 。加入 后,只可能改进为 ,因此只检查末尾 项。可行则增长,否则左端右移 ,维持长度;窗口本身允许暂不合法。最终长度即答案。
总时间复杂度 。
参考代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=500005;
ll a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
ll m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
int l=1;
ll sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(a[i]*(i-l+1)-sum>m)sum-=a[l++];
}
cout<<n-l+1<<'\n';
return 0;
}