Let’s solve the problem with just one query. Greedily, we should pick the candies with the most sugar first, since there is no benefit to picking a candy with less sugar.
So the solution is as follows: sort the candies in descending order, and then find the prefix whose sum is ≥ x ≥x ≥x. This is O ( n ) O(n) O(n) per query, which is too slow for us.
To speed it up, notice that we just need to find a prefix sum at least x x x. So if we compute the prefix sums of the reverse-sorted array, we need to find the first element that is at least x x x.
Since all elements of a a a are positive, the array of prefix sums is increasing. Therefore, you can binary search the first element ≥ x ≥x ≥x. This solves the problem in l o g n logn logn per query.
Total time complexity: O ( q l o g n + n ) O(qlogn+n) O(qlogn+n).
#include
using namespace std;
signed main()
{
int T;cin>>T;
while(T--)
{
int n,q;cin>>n>>q;
vector<int> a(n);
for(int i=0;i<n;i++) cin>>a[i];
sort(a.begin(),a.end(),greater<int>());
for(int i=1;i<n;i++) a[i]+=a[i-1];
for(int i=0;i<q;i++)
{
int x;cin>>x;
if(x>a[n-1]) cout<<"-1"<<endl;
else
{
int pos=lower_bound(a.begin(),a.end(),x)-a.begin();
cout<<pos+1<<endl;
}
}
}
return 0;
}