ABC334D 题解

思路

考虑贪心。

因为要求能拉的数量尽量多,所以从小到大排序,选择尽量小的。

前缀和排序后的数组,然后二分查找最后一个小于等于 queryquery 的数,输出这个数的下标即为答案。

介绍一个 STL 神器:upper_bound

使用方法:upper_bound(a.begin,a.end,q)-a

aa 从小到大排序的情况下,这个函数可以返回第一个大于 qq 的数的地址,因此后面要减去数组名(地址)。

而我们要求的是第一个小于等于 queryquery 的数,所以得到结果后减 11

该函数时间复杂度 O(logn)\operatorname{O}(\log n),总复杂度 O(nlogn)\operatorname{O}(n\log n),可以通过本题。

#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;
}
posted @ 2023-12-23 22:41  Weslie_qwq  阅读(19)  评论(0)    收藏  举报  来源