题目描述
又是一年秋季时,陶陶家的苹果树结了 n 个果子。陶陶又跑去摘苹果,这次他有一个 a 公分的椅子。当他手够不着时,他会站到椅子上再试试。
这次与 NOIp2005 普及组第一题不同的是:陶陶之前搬凳子,力气只剩下 s 了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在 s<0 之前最多能摘到多少个苹果。
现在已知 n 个苹果到达地上的高度 xi,椅子的高度 a,陶陶手伸直的最大长度 b,陶陶所剩的力气 s,陶陶摘一个苹果需要的力气 yi,求陶陶最多能摘到多少个苹果。
输入格式
第 1 行:两个数 苹果数 n,力气 s。
第 2 行:两个数 椅子的高度 a,陶陶手伸直的最大长度 b。
第 3 行~第 3+n-1 行:每行两个数 苹果高度 xi,摘这个苹果需要的力气 yi。
输出格式
只有一个整数,表示陶陶最多能摘到的苹果数。
思路
贪心初步--每次选取局部最优解,即先取需要力气小的苹果,最终才能保证取得最多苹果。
第一次没有AC的原因是忘了冒泡排序怎么写。。
for(int i=0;i<n-1;i++){
for(int j=i;j<n-1;j++){
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
代码
#include<stdio.h>
int main(){
int n,s,a,b;
int x[2][5010];
scanf("%d%d%d%d",&n,&s,&a,&b);//n-sum s-totalpower a+b-maxheight
for(int i=0;i<n;i++){
scanf("%d%d",&x[0][i],&x[1][i]);//0-appleheight 1-power
}
int t1,t2;
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(x[1][j]>x[1][j+1]){
t1=x[1][j];t2=x[0][j];
x[1][j]=x[1][j+1];x[0][j]=x[0][j+1];
x[1][j+1]=t1;x[0][j+1]=t2;
}
}
}
int cnt=0;
for(int i=0;i<n;i++){
if(a+b>=x[0][i]&&s-x[1][i]>=0){
cnt++;s-=x[1][i];
}else{
if(s-x[1][i]<0) break;
}
}
printf("%d",cnt);
return 0;
}