题目描述
【题目背景】
过新年了,陈老师想给同学们买一些礼物寄给大家。
【题目描述】
因为今年NOIP比赛大家成绩都很好,为了奖励大家,在新年的时候陈老师想要从
网上买一些礼物寄给大家。陈老师调研了大家喜欢的礼物,并且一一上网查到了
商品的价格,统计出了一张表。
陈老师有n名学生,每名学生想要的礼物都有一个价格pi和邮费si,也就是说,购
买这件礼物需要付pi+si元。陈老师只有b元的预算,他想给尽量多的同学购买礼
物。陈老师在整理购物车的时候发现,tb也给了他一个新年礼物,那就是一张优
惠券。这张优惠券能够让一个商品以半价购买,既使用了优惠券的商品需要付
pi/2+si元。
输入格式
第1行有2个正整数,表示共有n名学生和b元钱。
第2到n+1行,每行有两个正整数,分别代表这名同学想要的礼物的价格pi和邮
费si,数据保证pi一定为偶数。
输出格式
输出一行一个整数,表示要陈老师能够购买的最多礼物数。
样例输入content_copy
5 24
4 2
2 0
8 1
6 3
12 5
样例输出content_copy
4
提示/说明
样例二:
5 24
7 1
3 6
4 6
4 7
4 8
答案:
3
共有5名学生,有24元的预算。如果给第1~4名同学购买礼物,并且在购买第三
名同学的礼物时使用优惠券的话,总共会花(4+2)+(2+0)+(4+1)+(6+3) = 22
元,满足预算。容易发现陈老师无法给全部5名同学都买礼物,因此答案为4。
需要注意的是,在给1~4名同学买礼物时,这张优惠券如果在第1名同学或第4名
同学的礼物上使用,也可以满足预算条件。
【数据范围】
对于20%的数据,1 ≤ n ≤ 10,1 ≤ b,pi,si ≤ 1000;
对于60%的数据,1 ≤ n ≤ 5000,1 ≤ b,pi,si ≤ 109;
对于100%的数据,1 ≤ n ≤ 200000,1 ≤ b,pi,si ≤ 109。
完整代码:
#include<bits/stdc++.h>
using namespace std;
int n,b,sum,mx,p=1;
struct m{
int dj,yf,zj;
}a[200005];
bool cmp(m a,m b){
return a.zj<b.zj;
}
int main(){
freopen("gifts.in","r",stdin);
freopen("gifts.out","w",stdout);
cin>>n>>b;
for(int i=1;i<=n;i++){
cin>>a[i].dj>>a[i].yf;
a[i].zj=a[i].dj+a[i].yf;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
if(a[i].dj>mx) mx=a[i].dj;
if(b<a[i].zj&&p==1){
b+=mx/2;
p=0;
}
if(b>=a[i].zj){
sum++;
b-=a[i].zj;
}else{
break;
}
}
cout<<sum;
return 0;
}