```cpp
#include<iostream>
using namespace std;
int x[5001],y[5001],a,b,n,s,t=0;
bool used[5001];//标记该苹果是否被摘
int main()
{
cin>>n>>s;
cin>>a>>b;
a=a+b;
for(int i=1;i<=n;i++)
{
cin>>x[i];
cin>>y[i];
used[i]=0;
}
for(int i=1;i<=n;i++)
if(x[i]>a) used[i]=1;//若摘不到,视为已摘
int i=0;
while(s>=0)
{
int j=10000,k=1;
i=1;
while(used[i]&&i<=n) i++; //若苹果被摘,下一个
while(i<=n)
{
if(j>y[i]&&!used[i])
{
j=y[i];//j标记所用最小的力气
k=i;//k标记要摘的苹果
}
i++;
}
used[k]=1;//苹果已摘
s-=j;//力气减少
t++;//个数加一
}
cout<<t-1;//s小于零个数才加一,减去最后一个实际摘不到的
return 0;
}
认为是这样哈,希望对你有帮助,么么哒~
```
by xtx2004 @ 2017-09-01 21:48:30
80分求改程序
by MscWood @ 2017-09-05 21:10:15
```cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
struct apple {int h,t;};
apple a[5100],b[5100]; //结构体h表示高度,t表示消耗体力
int camp(apple x,apple y)
{
if(x.t <y.t )return 1;
else return 0;
} //自定义排序函数
using namespace std;
int main()
{
int ans=0,n,s,sh,bd,j,num;
j=0;
cin>>n>>s;
cin>>bd>>sh;
for(int i=1;i<=n;i++) cin>>a[i].h >>a[i].t ; //读入
for(int i=1;i<=n;i++)
{
if(a[i].h<=sh+bd)
{
j++;
b[j].h=a[i].h;
b[j].t=a[i].t;
}
} //把所有能摘到的筛选出来
num=j;
sort(b+1,b+num+1,camp); //按体力消耗有小到大排序
j=1;
while(1)
{
s-=b[j].t; //如果摘了某个体力为负,就跳出(因为体力按小到大排序了,后面更大)
if(s<0) break;
else {ans++; j++;} //不然个数加一
}
cout<<ans; //输出答案
return 0;
}
```
by MscWood @ 2017-09-05 21:10:35
这题坑,要先判断一下s是否为0。 以下满分程序
by MscWood @ 2017-09-05 21:13:44
```cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
struct apple {int h,t;};
apple a[5100],b[5100]; //结构体h表示高度,t表示消耗体力
int camp(apple x,apple y)
{
if(x.t <y.t )return 1;
else return 0;
} //自定义排序函数
using namespace std;
int main()
{
int ans=0,n,s,sh,bd,j,num;
j=0;
cin>>n>>s;
cin>>bd>>sh;
for(int i=1;i<=n;i++) cin>>a[i].h >>a[i].t ; //读入
if(s<=0) {cout<<0; return 0;}
for(int i=1;i<=n;i++)
{
if(a[i].h<=sh+bd)
{
j++;
b[j].h=a[i].h;
b[j].t=a[i].t;
}
} //把所有能摘到的筛选出来
num=j;
sort(b+1,b+num+1,camp); //按体力消耗有小到大排序
j=1;
while(1)
{
s-=b[j].t; //如果摘了某个体力为负,就跳出(因为体力按小到大排序了,后面更大)
if(s<0) break;
else {ans++; j++;} //不然个数加一
}
cout<<ans; //输出答案
return 0;
}
```
by MscWood @ 2017-09-05 21:13:55