BOZJ-2590 优惠券


题目:

约翰需要买更多的奶牛!交易市场上有n头奶牛等待出售,第ii头奶牛的原价是\(p_i\)元,使用优惠券之后,折扣价为\(c_i\)元。约翰有m元钱和k张优惠券。请问约翰最多能买多少头奶牛回家?每头牛只能用一张优惠券,每张优惠券的效果都一样。

输入格式

第一行:三个整数nkm第二行到第n+1行:第i+1行有两个整数\(p_i\)和\(c_i\)

输出格式

单个整数:表示约翰最多能买几头牛

数据范围

\(1 ≤ k ≤ n ≤ 50000,~1≤m≤10^{14}, 1≤c_i≤p_i≤10^9\)


题解:

首先可以根据\(c_i\)进行排序,可以发现一个问题:现在若有\(k\)张优惠券,那么将前\(k\)头用优惠券最便宜的牛全部买下。对于后面的牛,每一次操作,找出用普通价格买最便宜的牛,在没买的牛当中用优惠券买的最便宜的牛,在买了的牛当中,优惠券与普通价格只差(优惠券的赎金)最便宜的牛。

比较两个值:

  1. 最小赎金 + 最小优惠券价格
  2. 最小普通价格

所以只需要维护3个堆:

  1. 没买的用普通价格的堆
  2. 没买的用优惠券价格的堆
  3. 买了的赎金

代码:

#include <iostream>
#include <queue>
#include <algorithm> using namespace std;
typedef long long ll; const int maxn = 50005;
ll n, k, m;
pair<ll, ll> cost[maxn];
priority_queue< pair<ll, ll> > use_c_heap, not_use_c_heap, not_use_price_heap;
bool dead_price[maxn], dead_c[maxn]; void del_wait_coupen(ll a) {
dead_c[a] = true;
}
void del_wait_price(ll a) {
dead_price[a] = true;
} pair<ll, ll> top_wait_price() {
pair<ll, ll> a = not_use_price_heap.top();
while (dead_price[a.second]) {
not_use_price_heap.pop();
a = (not_use_price_heap.empty() ? (pair<ll, ll>) make_pair(0, 0) : not_use_price_heap.top());
}
return a;
} pair<ll, ll> top_wait_coupen() {
pair<ll, ll> a = not_use_c_heap.top();
while (dead_c[a.second]) {
not_use_c_heap.pop();
a = (not_use_c_heap.empty() ? (pair<ll, ll>) make_pair(0, 0) : not_use_c_heap.top());
}
return a;
} int main() {
ll ans = 0;
cin >> n >> k >> m;
for (int i = 1; i <= n; i ++) {
cin >> cost[i].second >> cost[i].first;
} sort(cost + 1, cost + 1 + n);
for (int i = 1; i <= k; i ++) {
if (m >= cost[i].first) {
use_c_heap.push(make_pair(-1 * (cost[i].second - cost[i].first), i));
m -= cost[i].first;
ans ++;
}
}
// 即便用优惠券,也买不起任意一头牛
if (ans == 0) {
cout << 0 << endl; return 0;
}
for (int i = k + 1; i <= n; i ++) {
not_use_c_heap.push(make_pair(-1 * cost[i].first, i));
not_use_price_heap.push(make_pair(-1 * cost[i].second, i));
}
for (int i = k + 1; i <= n; i ++) {
pair<ll, ll> wait_price = top_wait_price();
pair<ll, ll> wait_c = top_wait_coupen();
pair<ll, ll> use_cost_price = use_c_heap.top();
if ((-1 * wait_price.first) < ((-1 * wait_c.first) + (-1 * use_cost_price.first)) && m >= (-1 * wait_price.first)) {
not_use_price_heap.pop();
del_wait_coupen(wait_price.second);
ans ++;
m -= (-1 * wait_price.first);
} else {
if (m >= -1 * (wait_c.first + use_cost_price.first)) {
use_c_heap.pop();
del_wait_price(wait_c.second);
use_c_heap.push(make_pair(-1 * (cost[wait_c.second].second - (-1) * wait_c.first), wait_c.second));
ans ++;
m -= (-1 * (wait_c.first + use_cost_price.first));
}
}
}
cout << ans << endl;
return 0;
}

BOZJ-2590 优惠券的更多相关文章

  1. luogu 3045 优先队列反悔/bzoj 2590

    N头奶牛,价格Pi,K张优惠券,优惠券购买降为Ci,不超过M的钱最多可买多少奶牛 先将c值k小的加入,将它们省下的钱加入优先队列(省下的钱由少到多),在将k+1-n用p排序,再逐个与优先队列中弹出的比 ...

  2. 2590: [Usaco2012 Feb]Cow Coupons

    2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 306  Solved: 154[Su ...

  3. [deviceone开发]-Star分享的优惠券商户管理端App开源

    一.简介 这是一个优惠券的商主端,也就是配置发送优惠券的App 页面和交互还是像纳豆那样非常漂亮流畅,大家可以参考一下二.效果图 三.相关下载 https://github.com/do-projec ...

  4. MySQL_积分兑换的优惠券在某时间段内使用情况_ 20161215

    积分兑换的优惠券在某时间段内使用情况 SELECT a.城市,a.用户ID,a.优惠券ID,a.优惠券名称,a.积分兑换优惠券的张数,b.使用优惠券数量,a.积分兑换优惠券的金额,b.使用优惠券金额 ...

  5. [deviceone开发]-优惠券商户管理端App开源

    一.简介 这是一个优惠券的商主端,也就是配置发送优惠券的App 页面和交互还是像纳豆那样非常漂亮流畅,大家可以参考一下 二.效果图 三.源码分享 https://github.com/do-proje ...

  6. css3 绘制优惠券

    今天偶然发现了一个css3制作动画的地方,发现css3的径向渐变好难理解,幸亏有这里的大神介绍http://www.daqianduan.com/5989.html,这是优惠券的介绍 还有这个http ...

  7. 关于使用base36的技巧 生成 优惠券兑换码的相关讨论

    关于优惠券的生成后台的制作问题,已经拖了很久了还没有合并.但是持续暴露出来的问题 也很多,我的代码以及前面的一个人的代码被持续review暴露出了大量问题.昨天晚上在

  8. php生成 优惠券 激活码

    /** * 生成vip激活码 * @param int $nums 生成多少个优惠码 * @param array $exist_array 排除指定数组中的优惠码 * @param int $cod ...

  9. CSS3技巧:利用css3径向渐变做一张优惠券(转)

    在很多购物网站上都能看到优惠券,代金券,什么什么的券,但基本都是图片直接放上去,那么你有没有想过css来做一个呢,反正我是这样想过.那么你怎么做呢,切图做背景平铺边缘,嗯,有这样想过,如今css3技术 ...

  10. css3制作优惠券

    <div class="demo-container demo"><style> .demo{width:410px;} .stamp *{padding: ...

随机推荐

  1. 【2016常州一中夏令营Day2】

    小 W 学数学[问题描述]为了测试小 W 的数学水平,果果给了小 W N 个点,问他这 N 个点能构成的三角形个数.[输入格式]第一行一个整数 N,代表点数.接下来 N 行,每行两个非负整数 X.Y, ...

  2. JVM内存结构探秘及编码实战

    了解JVM内存结构的目的 在Java的开发过程中,因为有JVM自动内存管理机制,不再需要像在C.C++开发那样手动释放对象的内存空间,不容易出现内存泄漏和内存溢出的问题.但是,正是由于把内存管理的权利 ...

  3. Java中的Redis 哨兵高可用性

    让我们探索Redis Sentinel,看看如何在Java上运行它,一起来看看,最近get了很多新知识,分享给大家参考学习.需要详细的java架构思维导图路线也可以评论获取! 什么是Redis哨兵? ...

  4. requests爬取梨视频主页所有视频

    爬取梨视频步骤: 1.爬取梨视频主页,获取主页所有的详情页链接 - url: https://www.pearvideo.com/ - 1) 往url发送请求,获取主页的html文本 - 2) 解析并 ...

  5. Mysql的SQL优化指北

    概述 在一次和技术大佬的聊天中被问到,平时我是怎么做Mysql的优化的?在这个问题上我只回答出了几点,感觉回答的不够完美,所以我打算整理一次SQL的优化问题. 要知道怎么优化首先要知道一条SQL是怎么 ...

  6. 【题解】[NOI2019Route](70分)

    占坑 做法是拆掉所有式子,拆完式子看一下,如果A=0,发现边被分为了终点走向n的边和不走向n的边.所以边就有了新的边权,并且可以相加.然后通过网络流建模的套路建模使得满足时间的限制,然后由于有负边,所 ...

  7. 处理样本不平衡的LOSS—Focal Loss

    0 前言 Focal Loss是为了处理样本不平衡问题而提出的,经时间验证,在多种任务上,效果还是不错的.在理解Focal Loss前,需要先深刻理一下交叉熵损失,和带权重的交叉熵损失.然后我们从样本 ...

  8. Spring boot项目搭建及简单实例

    Spring boot项目搭建 Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for ...

  9. 《图解机器学习-杉山将著》读书笔记---CH2

    CH2 学习模型 重点提炼 学习模型作用: 使特定函数与数据集相近似 学习模型类型: 1.线性模型 (1)最简单的线性模型,缺点:只能表现线性的输入输出函数,不能很好地解决实际问题 (2)基于参数的线 ...

  10. AcWing 213. 古代猪文 数学知识

    传送门 题目描述: 给定整数n,q,计算 $q^{\sum_{d|n} C_{n}^{d}}$ mod 999911659. 输入格式 输入包括一行,包含两个整数n,q,用一个空格隔开. 输出格式 输 ...