题意分析想要推出尽可能多的补给舱,贪心策略:优先选消耗燃料最小的!
步骤:
将数组 R 从小到大排序
预处理前缀和数组 sum,sum[k] 表示选出前 k 个最小补给舱一共需要多少燃料
每次询问给定 X,在前缀和数组上二分查找最大的 k,满足 sum[k] <= X
关键点
N,Q<=2e5,暴力每个询问遍历会超时,必须前缀和 + 二分 O(Nlog N + Qlog N)
数值极大,要用 long long(64 位整数),不能用 int!
sum[0]=0:选 0 个消耗 0 燃料
样例 2 演算输入:4 3
5 3 11 8
16
7
1000
排序后:3,5,8,11
前缀和:
(sum[0]=0)
(sum[1]=3)
(sum[2]=8)
(sum[3]=16)
(sum[4]=27)
X=16:最大 k=3
X=7:只能满足 sum [1]=3 → k=1
X=1000:全部满足 → k=4
和样例输出完全一致。
重要细节说明
全部燃料变量必须 long long(#define int long long)
upper_bound(A.begin(),A.end(),X) 返回第一个大于 X的迭代器,减去起始地址得到索引,再减一就是最多能选的数量。
partial_sum(a.begin(),a.end(),pre.begin()+1);是前缀和函数;