新年礼物(gifts)

题目描述

【题目背景】

过新年了,陈老师想给同学们买一些礼物寄给大家。

【题目描述】

因为今年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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值