CF1614A Divan and a Store

题目大意

nn 个物品,第 ii 个商品的价格为 aia_i

给你 llrr,表示商人只会选择价格在 [l,r][l,r] 内的物品。

商人有 kk 元钱,问你商人最多可以买多少个商品。

TT 组数据。

对于 100%100\% 的数据,保证 1T100,1n100,1lr109,1 leqk109,1ai1091\leq T \leq 100,1 \leq n \leq 100,1 \leq l \leq r \leq 10^9,1 \ leq k \leq 10^9,1 \leq a_i \leq 10^9

解题思路

贪心,每次买剩下的价格最小的商品。

首先选出满足条件的物品,放到优先队列里(最小值优先)。

然后一件一件弹出来,计算钱数,若钱数 >k> k 或队列为空,结束程序。

时间复杂度 O(Tnlogn)\mathcal O(Tn \log n)

CODE

#include <bits/stdc++.h>

using namespace std;

#define int long long

int t;

int n, l, r, k;

signed main()
{
    scanf("%lld", &t);
    while (t--)
    {
        scanf("%lld%lld%lld%lld", &n, &l, &r, &k);
        priority_queue<int, vector<int>, greater<int>> q;
        for (int i = 1, a; i <= n; ++i)
        {
            scanf("%lld", &a);
            if (a < l || a > r)
                continue;
            q.push(a);
        }
        int ans = 0, sum = 0;
        while (!q.empty())
        {
            int now = q.top();
            q.pop();
            sum += now;
            // cout << now << "\n";
            if (sum <= k)
                ans++;
            else
                break;
        }
        printf("%lld\n", ans);
    }
    return 0;
}
posted @ 2021-11-28 13:07  蒟蒻orz  阅读(0)  评论(0编辑  收藏  举报  来源