LuoguP3045 [USACO12FEB]牛券Cow Coupons

果然我贪心能力还是太差了

ZR讲过的原题我回来对做法没有一丁点印象

有时候有这样一种题目

每个数有两种不同的价值

你可以选择价值低的,也可能花费一些神秘能力去获得价值高的

这时候我们直接贪心就可能会出现这种情况

当前最后解不是全局最优解

一般这种时候有两节决策,

要么DP

要么尝试进行可反悔的贪心

我们先按照所有牛的优惠后的价格排序,开一个小根堆

将前\(k\)个用优惠劵去买,很明显这可能是错误的

我们就将优惠券买的每一头牛的\(p - c\)丢到堆中,

对于一头使用了优惠券的牛\(i\)和未使用优惠券的牛\(j\)

如果有

\[c_i+p_j > c_j+p_i
\]

那么说明把优惠券用到\(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的更多相关文章

  1. 洛谷P3045 [USACO12FEB]牛券Cow Coupons

    P3045 [USACO12FEB]牛券Cow Coupons 71通过 248提交 题目提供者洛谷OnlineJudge 标签USACO2012云端 难度提高+/省选- 时空限制1s / 128MB ...

  2. [USACO12FEB]牛券Cow Coupons(堆,贪心)

    [USACO12FEB]牛券Cow Coupons(堆,贪心) 题目描述 Farmer John needs new cows! There are N cows for sale (1 <= ...

  3. P3045 [USACO12FEB]牛券Cow Coupons

    P3045 [USACO12FEB]牛券Cow Coupons 贪心题.先选中 \(c_i\) 最小的 \(k\) 头牛,如果这样就超过 \(m\) ,直接退出,输出答案.否则考虑把后面的牛依次加入, ...

  4. 牛券Cow Coupons

    USACO12FEB 久违的奶牛题. 题意: FJ准备买一些新奶牛,市场上有 $ N $ 头奶牛 $ (1 \leq N \leq 50000) $ ,第i头奶牛价格为 $ P_i (1 \leq P ...

  5. [USACO12FEB]牛券Cow Coupons

    嘟嘟嘟 这其实是一道贪心题,而不是dp. 首先我们贪心的取有优惠券中价值最小的,并把这些东西都放在优先队列里,然后看[k + 1, n]中,有些东西使用了优惠券减的价钱是否比[1, k]中用了优惠券的 ...

  6. [Usaco2012 Feb] Cow Coupons

    [Usaco2012 Feb] Cow Coupons 一个比较正确的贪心写法(跑得贼慢...) 首先我们二分答案,设当前答案为mid 将序列按照用券之后能省掉的多少排序,那么我们对于两种情况 \(m ...

  7. P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)

    P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...

  8. bzoj1638 / P2883 [USACO07MAR]牛交通Cow Traffic

    P2883 [USACO07MAR]牛交通Cow Traffic 对于每一条边$(u,v)$ 设入度为0的点到$u$有$f[u]$种走法 点$n$到$v$(通过反向边)有$f2[v]$种走法 显然经过 ...

  9. P3014 [USACO11FEB]牛线Cow Line && 康托展开

    康托展开 康托展开为全排列到一个自然数的映射, 空间压缩效率很高. 简单来说, 康托展开就是一个全排列在所有此序列全排列字典序中的第 \(k\) 大, 这个 \(k\) 即是次全排列的康托展开. 康托 ...

随机推荐

  1. 2017校赛 问题 D: 我知道了,你知道了吗?【递归】

    题目描述 Alice和Bob走在去学校的路上,听到两个路人的对话: 路人甲:我知道了, 你知道了吗? 路人乙:我知道你知道了,你知道了吗? 路人甲:我知道你知道我知道了,你知道了吗? 路人乙:我知道你 ...

  2. hdu3549 最大流

    #include<stdio.h> #include<string.h> #include<queue> #define MAXN 1010 using names ...

  3. python 编码和解码

  4. Java练习 SDUT-2787_加密术

    加密术 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 加密技术是一种常用的安全保密手段,利用加密技术可以把重要的数据变 ...

  5. Python中的socket

    socket()模块函数用法 import socket socket.socket(socket_family,socket_type,protocal=0) socket_family 可以是 A ...

  6. 走近科学,探究阿里闲鱼团队通过数据提升Flutter体验的真相

    背景 闲鱼客户端的flutter页面已经服务上亿级用户,这个时候Flutter页面的用户体验尤其重要,完善Flutter性能稳定性监控体系,可以及早发现线上性能问题,也可以作为用户体验提升的衡量标准. ...

  7. 使用DECLARE定义条件和处理程序

    定义条件和处理程序是事先定义程序执行过程中可能遇到的问题,并且可以在处理程序中定义解决这些问题的办法,可以简单理解 为异常处理,这种方式可以提前预测可能出现的问题,并提出解决办法,从而增强程序健壮性. ...

  8. Core Data 数据出现Fault

    I am mapping Json Data from Server using Restkit and I am Displaying those data by fetching from db. ...

  9. laravel多表登录出现路由调用错误

    public function auth() { // Authentication Routes... $this->get('login', 'Auth\LoginController@sh ...

  10. [kuangbin带你飞]专题九 连通图E POJ 3177 Redundant Paths

    这个题最开始我想的是,直接缩点求双连通分量,连接这些双联通分量不就行了吗? 但是其实是不对的,双连通内部双联通,我们如果任意的连接一条边在这些双联通分量之间,他们之间有没有桥其实并不知道. 我应该是求 ...