LuoguP3045牛券Cow Coupons
LuoguP3045 [USACO12FEB]牛券Cow Coupons
果然我贪心能力还是太差了
ZR讲过的原题我回来对做法没有一丁点印象
有时候有这样一种题目
每个数有两种不同的价值
你可以选择价值低的,也可能花费一些神秘能力去获得价值高的
这时候我们直接贪心就可能会出现这种情况
当前最后解不是全局最优解
一般这种时候有两节决策,
要么DP
要么尝试进行可反悔的贪心
我们先按照所有牛的优惠后的价格排序,开一个小根堆
将前\(k\)个用优惠劵去买,很明显这可能是错误的
我们就将优惠券买的每一头牛的\(p - c\)丢到堆中,
对于一头使用了优惠券的牛\(i\)和未使用优惠券的牛\(j\)
如果有
\]
那么说明把优惠券用到\(j\)上更优
那么我们就把后\(n - k\)头牛按照\(p\)排序
每次看一看反悔是否更优就好了
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long
#define pii pair<LL,int>
#define mk make_pair
#define fi first
#define se second
using namespace std;
const int N = 1e5 + 3;
priority_queue <pii,vector<pii>,greater<pii> > q;
LL n,m,k;int ans;
struct node{
LL p;
LL c;
}a[N];
bool book[N];
LL sum,tot;
inline bool cmp(node x,node y){
return x.c < y.c;
}
inline bool cmpp(node x,node y){
return x.p < y.p;
}
inline LL read(){
LL v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
int main(){
n = read(),k = read(),m = read();
for(int i = 1;i <= n;++i) a[i].p = read(),a[i].c = read();
sort(a + 1,a + n + 1,cmp);
LL sum = 0;
for(int i = 1;i <= k;++i){
sum += a[i].c;
if(sum > m){
printf("%d\n",i - 1);
return 0;
}
q.push(mk(a[i].p - a[i].c,i));
}
ans = k;
sort(a + k + 1,a + n + 1,cmpp);
for(int i = k + 1;i <= n;++i){
pii x = q.top();
if(a[x.se].c + a[i].p > a[x.se].p + a[i].c){
ans++;
sum = sum - a[x.se].c;
sum = sum + a[i].c + a[x.se].p;
q.pop();
q.push(mk(a[i].p - a[i].c,i));
}
else{
ans++;
sum += a[i].p;
}
if(sum > m) {printf("%d\n",ans - 1);return 0;}
}
printf("%lld\n",n);
return 0;
}
LuoguP3045牛券Cow Coupons的更多相关文章
- 洛谷P3045 [USACO12FEB]牛券Cow Coupons
P3045 [USACO12FEB]牛券Cow Coupons 71通过 248提交 题目提供者洛谷OnlineJudge 标签USACO2012云端 难度提高+/省选- 时空限制1s / 128MB ...
- [USACO12FEB]牛券Cow Coupons(堆,贪心)
[USACO12FEB]牛券Cow Coupons(堆,贪心) 题目描述 Farmer John needs new cows! There are N cows for sale (1 <= ...
- P3045 [USACO12FEB]牛券Cow Coupons
P3045 [USACO12FEB]牛券Cow Coupons 贪心题.先选中 \(c_i\) 最小的 \(k\) 头牛,如果这样就超过 \(m\) ,直接退出,输出答案.否则考虑把后面的牛依次加入, ...
- 牛券Cow Coupons
USACO12FEB 久违的奶牛题. 题意: FJ准备买一些新奶牛,市场上有 $ N $ 头奶牛 $ (1 \leq N \leq 50000) $ ,第i头奶牛价格为 $ P_i (1 \leq P ...
- [USACO12FEB]牛券Cow Coupons
嘟嘟嘟 这其实是一道贪心题,而不是dp. 首先我们贪心的取有优惠券中价值最小的,并把这些东西都放在优先队列里,然后看[k + 1, n]中,有些东西使用了优惠券减的价钱是否比[1, k]中用了优惠券的 ...
- [Usaco2012 Feb] Cow Coupons
[Usaco2012 Feb] Cow Coupons 一个比较正确的贪心写法(跑得贼慢...) 首先我们二分答案,设当前答案为mid 将序列按照用券之后能省掉的多少排序,那么我们对于两种情况 \(m ...
- P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...
- bzoj1638 / P2883 [USACO07MAR]牛交通Cow Traffic
P2883 [USACO07MAR]牛交通Cow Traffic 对于每一条边$(u,v)$ 设入度为0的点到$u$有$f[u]$种走法 点$n$到$v$(通过反向边)有$f2[v]$种走法 显然经过 ...
- P3014 [USACO11FEB]牛线Cow Line && 康托展开
康托展开 康托展开为全排列到一个自然数的映射, 空间压缩效率很高. 简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开. 康托 ...
随机推荐
- 【风马一族_php】PHP运算
运算 算术运算符 <?php //加法 $num1 = 10; $num2 = 43; echo $num1 + $num2; echo " "; var_dump($num ...
- hdu4313 贪心+并查集
题意简单思路也还可以.开始从小到大排序非常烦.后来从大到小就很简单了: 从大到小解决了删除的边最小. #include<stdio.h> #include<string.h> ...
- 【NS2】WiMAX_NS2说明文档(转载)
关于目前NS2中WiMAX模块的说明 (1)美国NIST(National Institute of Standards and Technology)版, 可以从NIST主页获得,2007.04 r ...
- pytest笔记
-v 参数显示执行过程 测试覆盖率: ldy@ldy-D214:~/workspace/socai$ pipenv run pytest tests/unit/test_models.py --cov ...
- 关于 KiCad 画圆弧走线
关于 KiCad 画圆弧走线 有很多关于 关于 KiCad 画圆弧走线的帖子. 最新进展是 V6 在开发中. 但是因为关于 DRC 问题,开发好像有难度. https://bugs.launchpad ...
- Laravel 的HTTP控制器
简介# 除了在路有文件中以闭包的形式定义所有的请求处理逻辑外,还可以使用控制器类来组织此类行为,控制器能够将相关 的请求处理逻辑组成的一个单独的类,控制器被存放在app/Http/Controller ...
- php服务端允许跨域访问
>>php服务端允许跨域访问<< >>同源策略和跨域解决方案<<
- 使用sqlyog链接多个主机的数据库
- ELMo解读(论文 + PyTorch源码)
ELMo的概念也是很早就出了,应该是18年初的事情了.但我仍然是后知后觉,居然还是等BERT出来很久之后,才知道有这么个东西.这两天才仔细看了下论文和源码,在这里做一些记录,如果有不详实的地方,欢迎指 ...
- 2018-11-19-Roslyn-NameSyntax-的-ToString-和-ToFullString-的区别
title author date CreateTime categories Roslyn NameSyntax 的 ToString 和 ToFullString 的区别 lindexi 2018 ...