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 @   Weslie_qwq  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示