核心思路就是:
枚举我是倒数第i名,判断最多能够打赢i场,是否可以打赢倒数i+1的人。
如果打不过倒数第i+1的人,我是倒数第i名的话我至少打得过i个人(赢i次,和原本倒数第i名赢的次数相同),我们可以用一个单独的数组b去复制数组a,并排序后维护数组b的前缀和(方便我们判断能否打败前i个人),如果能够打败数组b中前i个人,那么我的名次就是ans = min(ans, n - i + 1);
if(m>=sum[i])ans=min(ans,n-i+1);
我们可以试着去判断能不能打赢倒数第i+1的人(ai+1),不去和前i个里面最难打的人打了(bi),如果打赢了,就成功将倒数第i+1的人胜场数与我相同,那么此时我也是倒数第i+1,名次为n-i
if(i<n&&m>=sum[i]+max(a[i+1]-b[i],0ll))ans=min(ans,n-i);
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
const int N = 1e5+10;
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
void solve()
{
int n,m;
cin>>n>>m;
vector<int>a(n+1),b(n+1),sum(n+1);
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b.begin()+1,b.end());
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+b[i];
}
int ans=n+1;
for(int i=1;i<=n;i++)
{
if(m>=sum[i])
{
ans=min(ans,n-i+1);
}
if(i<n&&sum[i]+max(a[i+1]-b[i],0ll)<=m)
{
ans=min(ans,n-i);
}
}
cout<<ans<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
}