BOZJ-2590 优惠券
BOZJ-2590 优惠券
题目:
约翰需要买更多的奶牛!交易市场上有n头奶牛等待出售,第ii头奶牛的原价是\(p_i\)元,使用优惠券之后,折扣价为\(c_i\)元。约翰有m元钱和k张优惠券。请问约翰最多能买多少头奶牛回家?每头牛只能用一张优惠券,每张优惠券的效果都一样。
输入格式
第一行:三个整数n,k和m第二行到第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\)头用优惠券最便宜的牛全部买下。对于后面的牛,每一次操作,找出用普通价格买最便宜的牛,在没买的牛当中用优惠券买的最便宜的牛,在买了的牛当中,优惠券与普通价格只差(优惠券的赎金)最便宜的牛。
比较两个值:
- 最小赎金 + 最小优惠券价格
- 最小普通价格
所以只需要维护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 优惠券的更多相关文章
- luogu 3045 优先队列反悔/bzoj 2590
N头奶牛,价格Pi,K张优惠券,优惠券购买降为Ci,不超过M的钱最多可买多少奶牛 先将c值k小的加入,将它们省下的钱加入优先队列(省下的钱由少到多),在将k+1-n用p排序,再逐个与优先队列中弹出的比 ...
- 2590: [Usaco2012 Feb]Cow Coupons
2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 306 Solved: 154[Su ...
- [deviceone开发]-Star分享的优惠券商户管理端App开源
一.简介 这是一个优惠券的商主端,也就是配置发送优惠券的App 页面和交互还是像纳豆那样非常漂亮流畅,大家可以参考一下二.效果图 三.相关下载 https://github.com/do-projec ...
- MySQL_积分兑换的优惠券在某时间段内使用情况_ 20161215
积分兑换的优惠券在某时间段内使用情况 SELECT a.城市,a.用户ID,a.优惠券ID,a.优惠券名称,a.积分兑换优惠券的张数,b.使用优惠券数量,a.积分兑换优惠券的金额,b.使用优惠券金额 ...
- [deviceone开发]-优惠券商户管理端App开源
一.简介 这是一个优惠券的商主端,也就是配置发送优惠券的App 页面和交互还是像纳豆那样非常漂亮流畅,大家可以参考一下 二.效果图 三.源码分享 https://github.com/do-proje ...
- css3 绘制优惠券
今天偶然发现了一个css3制作动画的地方,发现css3的径向渐变好难理解,幸亏有这里的大神介绍http://www.daqianduan.com/5989.html,这是优惠券的介绍 还有这个http ...
- 关于使用base36的技巧 生成 优惠券兑换码的相关讨论
关于优惠券的生成后台的制作问题,已经拖了很久了还没有合并.但是持续暴露出来的问题 也很多,我的代码以及前面的一个人的代码被持续review暴露出了大量问题.昨天晚上在
- php生成 优惠券 激活码
/** * 生成vip激活码 * @param int $nums 生成多少个优惠码 * @param array $exist_array 排除指定数组中的优惠码 * @param int $cod ...
- CSS3技巧:利用css3径向渐变做一张优惠券(转)
在很多购物网站上都能看到优惠券,代金券,什么什么的券,但基本都是图片直接放上去,那么你有没有想过css来做一个呢,反正我是这样想过.那么你怎么做呢,切图做背景平铺边缘,嗯,有这样想过,如今css3技术 ...
- css3制作优惠券
<div class="demo-container demo"><style> .demo{width:410px;} .stamp *{padding: ...
随机推荐
- Kali之msf简单的漏洞利用
1.信息收集 靶机的IP地址为:192.168.173.136 利用nmap工具扫描其开放端口.系统等 整理一下目标系统的相关信息 系统版本:Windows server 2003 开放的端口及服务: ...
- 第二阶段:2.商业需求文档MRD:5.MRD-Roadmap及规划
产品路线图可以用泳道图来实现.将之前做过的泳道图的角色换为阶段即可. 可以以月为单位.左边就是一些产品的功能. 基础功能,有的功能会跨月甚至夸功能模块.比如图中的会员等级. 通过线段来联系各个功能与先 ...
- Jmeter-Ant 生成测试报告配置步骤
1.配置java环境变量(不会的可以自行百度) 2.安装jmeter 3.安装ant,配置ant环境变量 4.将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.jar复制 ...
- MinGW-W64下载与安装
安装方案 1 下载安装包,MinGW-w64 - for 32 and 64 bit Windows,然后直接以管理员安装即可,但是这个方案在部分电脑可能不行,会提示 cannot download ...
- Go并发编程
概述 简而言之,所谓并发编程是指在一台处理器上"同时"处理多个任务. 随着硬件的发展,并发程序变得越来越重要.Web服务器会一次处理成千上万的请求.平板电脑和手机app在渲染用户画 ...
- 一个简单的spring boot程序
搭建一个spring boot项目十分的方便,网上也有许多,可以参考 https://www.cnblogs.com/ityouknow/p/5662753.html 进行项目的搭建.在此我就不详细介 ...
- makefile个人理解
makefile makefile抽象层面的理解 学习某一样东西之前一定要明确学习的目的,即学习了这项工具能解决一些什么问题,其优势是什么? makefile的优势就是能够动态根据文件的新旧来决定是否 ...
- 《C++Primer》第五版习题答案--第二章【学习笔记】
C++Primer第五版习题解答---第二章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/9 第二章:变量和基本类型 练习2.1: 类 ...
- 每日一问2:堆(heap)和栈(stack)的区别
因为这里没有明确指出堆是指数据结构还是存储方式,所以两个尝试都回答一下. 一.堆和栈作为数据结构 1.堆(heap),也叫做优先队列(priority queue),队列中允许的操作是先进先出(FIF ...
- 理解TCP/IP协议栈之HTTP2.0
1 前言 前面写了10多篇关于Redis底层实现.工程架构.实际应用的文章,感兴趣的读者可以进行阅读,如有问题欢迎交流: 1.Redis面试热点之底层实现篇-12.Redis面试热点之底层实现篇-23 ...