题目描述:
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 ≤ ,1 ≤ b[ i ] ≤ a[ i ] ≤
#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;
}