购物

这篇博客探讨了一种使用贪心策略解决购买商品的最大数量问题。在给定商品价格、现金金额和优惠券数量的情况下,通过优先考虑最优交易(使用或不使用优惠券),并维护一个优先级队列来撤销优惠券选择,从而找到最大购买量。代码实现中,首先对商品价格和优惠后的价格进行排序,然后逐步尝试购买,确保资金的有效利用。
摘要由CSDN通过智能技术生成

题目大意

n n n 件商品,每一件商品价格为 P i P_i Pi 个单位。

现在你手中共有 m m m 个单位的现金,以及 k k k 张优惠券。

你可以在购买某件商品时,使用至多一张优惠券,若如此做,该商品的价格会下降至 Q i Q_i Qi

请问你至多能购买多少件商品。

解题思路

考虑贪心,先不考虑有没有优惠卷的情况肯定是从小到大买,这样一定会买的最多的。

按照这个思想,每一次买的时候就找最小的。

有两种情况:

  • 使用了优惠券之后获得了一个最小值。
  • 没有使用优惠券的最小值。

分别对 p p p q q q 进行排序。

每次找最小的。

还要将用来优惠券的那些东西按照 p i − q i p_i − q_i piqi 放到堆里面,为以后撤销优惠券使用。

这就是反悔贪心。

AC CODE

#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
#define int long long
 
const int maxn = 1e6 + 5;
 
struct node
{
    int p, q;
    bool operator < (const node& rhs) const
    {
        return p - q > rhs.p - rhs.q;
    }
} a[maxn];
 
int n, k, ans;
long long m;
priority_queue<node> Q;
 
bool cmp(node a, node b)
{
    if(a.q != b.q)
        return a.q < b.q;
    return a.p < b.p;
}
 
bool CMP(node a, node b)
{
    return a.p < b.p;
}
 
signed main()
{
    scanf("%lld%lld%lld", &n, &k, &m);
    for (int i = 1; i <= n; i++)
        scanf("%lld%lld", &a[i].p, &a[i].q);
    sort(a + 1, a + n + 1, cmp);
    for (int i = 1; i <= k; i++)
    {
        m -= a[i].q;
        Q.push(a[i]);
        if (m < 0)
        {
            printf("%lld\n", i - 1);
            return 0;
        }
    }
    ans = k;
    sort(a + k + 1, a + n + 1, CMP);
    for (int i = k + 1; i <= n; i++)
    {
        int tp = Q.top().p, tq = Q.top().q;
        if (a[i].p - a[i].q > tp - tq && a[i].q + tp - tq <= m)
        {
            m -= (a[i].q + tp - tq);
            ans++, Q.pop(), Q.push(a[i]);
        }
        else if (a[i].p <= m)
            ans++, m -= a[i].p;
    }
    printf("%lld\n", ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值