链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网
问题描述: 小沙是一家超市的老板,超市里有 n 件商品。小沙有 Q 个问题,每个问题都是关于挑选价值不超过 x 的最多 k 件商品的情况下,能够挑选的商品的总价值最大为多少。请你帮助小沙回答这些问题。
输入描述: 第一行输入两个整数 n 和 Q,表示商品的个数和问题的个数。 (1 ≤ n ≤ 10^5, 1 ≤ Q ≤ 10^5) 第二行输入 n 个整数,表示每个商品的价格。 (1 ≤ ai ≤ 10^9) 接下来的 Q 行,每行输入两个正整数 k 和 x,表示需要选择商品的最大数量和价值上限。 (1 ≤ k ≤ n, 1 ≤ x ≤ 10^9)
输出描述: 对于每个问题,输出一行表示能够挑选的商品的总价值最大为多少。
示例:
输入:
5 3
1 3 3 5 10
4 3
2 3
3 10
输出:
7
6
18
解决这个问题需要运用到的知识点有: 1.sort排序以及对于大于x值的第一个数的下标的查找 2.前缀和 这个题不难理解主要是实现麻烦,如果暴力查找第一个大于x的数据在数组里的下标则会超时; 前缀和是方便你处理所选的数据数量为k或者小于k并且无需再累加; #include<iostream> #include<algorithm> using namespace std; const int N=100010; long long int n,q,k,x; long long int a[N],s[N]={0}; int main() { cin>>n>>q; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+1+n); for(int i=1;i<=n;i++){ s[i]=s[i-1]+a[i];//前缀和,使s[i]的值为a[1]...到a[i]的值相加 } while(q--){ cin>>k>>x; long long int cnt=0; long long int m=upper_bound(a+1,a+1+n,x)-a;//对于在sort排序好之后的数组里查找第一个大于x的数值的下标; //补充:long long int* m=upper_bound(a+1,a+1+n,x);这里的话m表示的是比x大的第一个数据的值,进行累加的话可以是s+=*m;m--;此时*m是代表指针m所指的地址的值; m--;//指针减一; if(m<=k){ cnt=s[m]; }else{ cnt=s[m]-s[m-k]; } cout<<cnt<<"\n"; } return 0; }