[Usaco2012 Feb] Cow Coupons

一个比较正确的贪心写法(跑得贼慢。。。)

首先我们二分答案,设当前答案为mid

将序列按照用券之后能省掉的多少排序,那么我们对于两种情况

  1. \(mid \leq k\) 全部取用券后的,取最小的\(mid\)个

  2. 排序后我们枚举分界点,对于右边\(p-c\)较大的,我们肯定考虑把k个券用给它们,就可以在左边取\(p\)最小的\(mid-k\)个,和右边的\(c\)最小的\(k\)个即可

    这个我们用堆维护即可

#include<bits/stdc++.h>
using namespace std; #define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i) char IO;
int rd(){
int s=0,f=0;
while(!isdigit(IO=getchar())) if(IO=='-') f=1;
do s=(s<<1)+(s<<3)+(IO^'0');
while(isdigit(IO=getchar()));
return f?-s:s;
} template <class T> inline void cmax(T &a,T b){ ((a<b)&&(a=b)); }
template <class T> inline void cmin(T &a,T b){ ((a>b)&&(a=b)); } const int N=5e4+10,P=998244353; int n,k;
ll m;
struct Node{
int a,b;
bool operator < (const Node __) const {
return a-b<__.a-__.b;
}
} A[N]; priority_queue <int> que;
void clear(){
while(!que.empty()) que.pop();
} ll s1[N],s2[N];
int Check(int mid){
if(mid<=k) {
clear();
rep(i,1,n) que.push(-A[i].b);
ll res=0;
rep(i,1,mid) res-=que.top(),que.pop();
return res<=m;
} else {
clear();
ll t=0;
rep(i,1,n) {
que.push(A[i].a);t+=A[i].a;
while((int)que.size()>mid-k) t-=que.top(),que.pop();
if((int)que.size()==mid-k) s1[i]=t;
} // 预处理两边最小的几个
ll res=1e18;
rep(i,mid-k,n-k) cmin(res,s1[i]+s2[i+1]); //枚举分界点
return res<=m;
}
} int main(){
n=rd(),k=rd(),scanf("%lld",&m);
rep(i,1,n) A[i].a=rd(),A[i].b=rd();
sort(A+1,A+n+1);
ll t=0;
drep(i,n,1) {
que.push(A[i].b);t+=A[i].b;
while((int)que.size()>k) t-=que.top(),que.pop();
if((int)que.size()==k) s2[i]=t;
}
int l=1,r=n,res=0;
while(l<=r) {
int mid=(l+r)>>1;
if(Check(mid)) l=mid+1,res=mid;
else r=mid-1;
}
printf("%d\n",res);
}

代码细节可能挂了,如果有hack数据发在评论里谢谢

[Usaco2012 Feb] Cow Coupons的更多相关文章

  1. 2590: [Usaco2012 Feb]Cow Coupons

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

  2. BZOJ2590 [Usaco2012 Feb]Cow Coupons

    好吧...想了半天想错了...虽然知道是贪心... 我们每次找没有被买的两种价格最小的牛,比较a = 当前差价最大的 + 当前优惠券价格最小的牛与b = 当前非优惠券价格最小的牛 所以...我们要 先 ...

  3. 【贪心】【堆】bzoj2590 [Usaco2012 Feb]Cow Coupons

    每个物品有属性a,b 考虑在仅仅用光优惠券时的最优方案. 显然是按照b排序,取前K个. 但是我们还要尽可能去取剩余的. 假设朴素地取剩余的话,应该把剩余的对a排序,然后尽量去取. 但是有可能对其用优惠 ...

  4. USACO 2012 Feb Cow Coupons

    2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec Memory Limit: 128 MB Submit: 349 Solved: 181 [Su ...

  5. [Usaco 2012 Feb]Cow coupons牛券:反悔型贪心

    Description Farmer  John  needs  new  cows! There  are  N  cows  for  sale (1 <= N <= 50,000), ...

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

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

  7. BZOJ1631: [Usaco2007 Feb]Cow Party

    1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 459  Solved: 338[Submit ...

  8. BZOJ3301: [USACO2011 Feb] Cow Line

    3301: [USACO2011 Feb] Cow Line Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 67  Solved: 39[Submit ...

  9. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 215[S ...

随机推荐

  1. oracle查看执行计划入门

    基于Oracle的应用系统很多的性能问题都是由应用系统的SQL性能低劣引起的,因此SQL的性能优化非常重要.要分析与优化SQL的性能,一般是通过查看该SQL的执行计划,然后通过执行计划有针对性地对SQ ...

  2. springboot+RabbitMQ 问题 RabbitListener 动态队列名称:Attribute value must be constant

    因为多机环境fanout广播模式,每台机器需要使用自己的队列接受消息 所以尝试使用以下的方案 private static final String QUEUE_NAME="foo.&quo ...

  3. Java程序使用Alpine Linux报错java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy解决

    报错内容 Caused by: java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.7-4a4b576a-c34c-481e-b6ac-9b4abacb11 ...

  4. FrameworkCubeMX.gpdsc missing的问题

    (1)上图红框内容均不要勾选 (2)工程中自己添加相应的启动文件,形如: startup_stm32f030x6.s system_stm32f0xx.c

  5. TransactionScope 使用的注意事项

    前两天为了给代码做一些事务封装,写了个小Demo,用TransactionScope代码块实现. 第一条更新成功后第二条刻意抛出异常,结果发现第一条总执行成功,这不符合预期,于是开始一步步跟踪调试. ...

  6. Redis安装和基本使用

    目录 Redis安装和基本使用 安装 配置 启动服务端 启动客户端 Redis键(key) 与键相关的基本命令 Redis字符串 常用字符串命令: Redis哈希 常用Hash命令 Redis 列表( ...

  7. es6的let与const

    es6新增命令let,用于声明变量,他与var的不同主要有三点: let有块级作用域 let没有变量提升 同级作用域内,let不可以重复定义 let有块级作用域: es5 for(var i=0;i& ...

  8. 很全的vue插件汇总,赶紧收藏下(转)

    Vue是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件特别整理了常用的vue插件,来了个大汇总,方便查找使用,便于工作 ...

  9. ztree实现复选框单选功能

    /** * ztree的默认配置项 * */ var setting = { view: { selectedMulti: false //按住ctrl是否可以多选 }, check: { enabl ...

  10. 隐马尔科夫模型(Hidden Markov Models) 系列之五

    转自:http://blog.csdn.net/eaglex/article/details/6458541 维特比算法(Viterbi Algorithm) 找到可能性最大的隐藏序列 通常我们都有一 ...