购买书籍[贪心][堆]

题目描述:

L 的书籍被 M 偷了以后伤心欲绝,决定再购买一些回来,现在有 N 本书可以买,每本书的价格是 a[ i ]元。

现在 L 总共有 M 元,以及 K 张优惠券。 对于每本书,如果使用一张优惠券,则可以用b[i]的优惠价格购买。 注意每本书只能使用一张优惠券,只能购买一次。

L想知道自己最多可以购买几本书?

输入格式:

第一行三个整数 N , K , M

接下来 N 行,每行两个整数,表示 a[ i ] 和 b[ i ]。

输出格式:

一个整数表示答案。

样例数据:

输入

4 1 7
3 2
2 2
8 1
4 3

输出

3

备注:

【解释】

选择第 1、 2、 3 本书,其中第 3 本使用优惠券。总共 5 元。

【数据规模】

对于 20%:N ≤ 10

对于 50%:N ≤ 100

对于另外 20%:K = 0

对于 100%:1 ≤ N ≤ 100000,0 ≤ K ≤ N,M ≤ 10^{14},1 ≤ b[ i ] ≤ a[ i ] ≤ 10^{9}



#include<bits/stdc++.h>
#define N 100005
#define LL long long 
using namespace std;
int n,m,ans;LL k,now;
struct Node{int a,b;}x[N];	
set<pair<int,int> > s1,s2,s3;
LL read(){
	LL cnt=0;char ch=0;
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar();
	return cnt;
}
bool cmp(Node x,Node y){return x.b<y.b;}
int main(){
	//freopen("1.in","r",stdin);
	//freopen("buy.out","w",stdout);
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++)
		x[i].a=read(),x[i].b=read();
	sort(x+1,x+n+1,cmp);
	for(int i=1;i<=m;i++){
		now+=x[i].b;if(now>k) goto die; ans++;
		s1.insert(make_pair(x[i].a-x[i].b,i));
	}
	for(int i=m+1;i<=n;i++){
		s2.insert(make_pair(x[i].a,i));
		s3.insert(make_pair(x[i].b,i));
	}
	while(!s2.empty()&&!s3.empty()){
		int f1=s1.begin()->first+s3.begin()->first;//把s1的优惠券用到s3上
		int f2=s2.begin()->first;
		if(f1<f2){//换 
			int p=s3.begin()->second;
			now+=f1;if(now>k) goto die; ans++;
			s1.erase(s1.begin());
			s1.insert(make_pair(x[p].a-x[p].b,p));
			s2.erase(s2.find(make_pair(x[p].a,p))),s3.erase(s3.begin());
		} 
		else{
			now+=f2;if(now>k) goto die; ans++;
			int p=s2.begin()->second;
			s2.erase(s2.begin()),s3.erase(s3.find(make_pair(x[p].b,p)));
		} 
	}
	die:
	printf("%d",ans);return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值