ABC334D 题解
思路
考虑贪心。
因为要求能拉的数量尽量多,所以从小到大排序,选择尽量小的。
前缀和排序后的数组,然后二分查找最后一个小于等于 的数,输出这个数的下标即为答案。
介绍一个 STL 神器:upper_bound。
使用方法:upper_bound(a.begin,a.end,q)-a。
在 从小到大排序的情况下,这个函数可以返回第一个大于 的数的地址,因此后面要减去数组名(地址)。
而我们要求的是第一个小于等于 的数,所以得到结果后减 。
该函数时间复杂度 ,总复杂度 ,可以通过本题。
#include<iostream>
#include<algorithm>
using namespace std;
long long a[200005],sum[200005],q;
int n,k;
int main() {
cin>>n>>k;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1; i<=n; i++)sum[i]=sum[i-1]+a[i];
while(k--) {
cin>>q;
int l=1,r=n,mid,f=0;
cout<<upper_bound(sum,sum+n+1,q)-sum-1<<endl;
}
return 0;
}

浙公网安备 33010602011771号