题解
注意到队伍人数应尽量少→队伍的最低能力值尽可能高,从而减少所需人数。
策略上从排序后的最大值开始遍历,计算每个能力值作为队伍最低值时需要的最少人数;若剩余人数足够,则组成队伍并扣除相应人数,否则跳过。
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n,x;
cin>>n>>x;
vector<long long> a(n);
for (int i=0;i<n;++i)cin>>a[i];
sort(a.begin(),a.end(),greater<long long>());
int teams=0,i=0;
while(i<n){
long long k=(x+a[i]-1)/a[i];
while(i+k-1<n){// 直到人数不足
long long min_val=a[i+k-1];
if (k*min_val>=x){
teams++;
i+=k;
break;
}
k++;
}
if(i+k-1>=n)break;
}
cout<<teams<<endl;
return 0;
}