Codeforces Round #790 (Div. 4) E. Eating Queries
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<bits/stdc++.h>
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;
}