题目描述
中秋节快到了,小科决定为他的N名魔法学徒每人买一盒月饼。小科带着学徒们来到月饼店,让学徒们挑选自己喜欢的月饼。学徒们欢天喜地的开始挑选月饼,没过多久学徒们就选好了自己喜爱的月饼。其中第i名学徒挑选的月饼每盒价格为P[i]元,另外由于月饼的保质期很短,所以月饼店对于每种月饼只会生产一盒样品放在店中展示,当客户挑选好月饼付完钱后月饼店才会生产月饼。为了不让客户再多跑一趟,月饼店还提供收费的送货上门服务。小科和学徒们平时都需要在山中修炼,每年只有一次的下山的机会,所以所有学徒都选择了送货上门服务。月饼的种类不同,送货上门的费用也不同,其中第i名学员挑选的月饼的送货上门费用为S[i]元,小科需要为第i个学员负担P[i]+S[i]元。等到学徒们都挑选好以后,小科来到收银台结账,小科只带了M元钱,算完账以后他发现他可能无法负担所有学徒购买月饼和送货上门的费用。于是小科和老板讨价还价,最终老板同意小科可以挑选一盒月饼,老板可以以半价出售这盒月饼,也就是说如果小科选择让第i个学徒选择的月饼半价,那么他只需要为这盒月饼支付P[i]/2元的费用,但是送货上门的费用无法减免,还是S[i]元。小科想知道他的M元钱,最多可以为多少名学徒购买到月饼(月饼的送货费用也需要小科支付)。
输入格式
第1行:两个空格分隔的整数N和M,分别表示学徒的数量和小科拥有的钱数。
接下来N行:每行两个空格分隔的整数,其中第i行的两个整数P[i],S[i]表示第i名学徒挑选的月饼的购买费用和送货上门费用。(数据保证所有的P[i]都是偶数)。
输出格式
1行:一个整数,表示小科可以为多少名学徒购买到月饼。
输入输出样例
输入样例1:
5 40 6 5 4 5 10 2 8 8 6 6
输出样例1:
4
说明
【数据范围】
对于100%的数据:1 ≤ N ≤ 1000;1 ≤ M ≤ 10^9;0 ≤ P[i], S[i] ≤ 10^9;P[i]都是偶数。
【样例说明】
小科有5名学徒,40元钱。小科的钱最多可以为4名学徒购买月饼,分别为学徒1、学徒2、学徒3和学徒5,并且选择半价购买学徒3的月饼,共需要(6+5) + (4+5) + (10/2+2) + (6 + 6) = 39元。
【耗时限制】1000ms 【内存限制】256MB
//
//Created by Carlgood.
//
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
struct youallturnintobirdslotsandlotsofbirds
{
int p,s;
}a[1010];
bool cmp(const youallturnintobirdslotsandlotsofbirds &x,const youallturnintobirdslotsandlotsofbirds &y)
{
return x.p+x.s<y.p+y.s;
}
int main()
{
int n,m,ans=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i].p>>a[i].s;
}
sort(a+1,a+n+1,cmp);
int cnt=0,sum=0;
for(int i=1;i<=n;i++)
{
cnt=0;
sum=0;
sum=a[i].p/2+a[i].s;
if(sum>m) continue;
cnt++;
for(int j=1;j<=n;j++)
{
if(j!=i)
{
sum+=a[j].p+a[j].s;
if(sum>m) break;
cnt++;
}
}
ans=max(ans,cnt);
}
cout<<ans;
return 0;
}