小沙の好客

链接:登录—专业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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值