題目描述 又是一年秋季時,陶陶家的蘋果樹結了n個果子。陶陶又跑去摘蘋果,這次她有一個a公分的椅子。當他手夠不著時,他會站到椅子上再試試。 這次與NOIP 2005普及組第一題不同的是:陶陶之前搬凳子,力氣只剩下s了。當然,每次摘蘋果時都要用一定的力氣。陶陶想知道在s<! more 輸入格式 第1行: ...
題目描述
又是一年秋季時,陶陶家的蘋果樹結了n個果子。陶陶又跑去摘蘋果,這次她有一個a公分的椅子。當他手夠不著時,他會站到椅子上再試試。
這次與NOIP 2005普及組第一題不同的是:陶陶之前搬凳子,力氣只剩下s了。當然,每次摘蘋果時都要用一定的力氣。陶陶想知道在s<0之前最多能摘到多少個蘋果。
現在已知n個蘋果到達地上的高度xi,椅子的高度a,陶陶手伸直的最大長度b,陶陶所剩的力氣s,陶陶摘一個蘋果需要的力氣yi,求陶陶最多能摘到多少個蘋果。
輸入格式
第1行:兩個數 蘋果數n,力氣s。
第2行:兩個數 椅子的高度a,陶陶手伸直的最大長度b。
第3行~第3+n-1行:每行兩個數 蘋果高度xi,摘這個蘋果需要的力氣yi。
輸出格式
只有一個整數,表示陶陶最多能摘到的蘋果數。
輸入輸出樣例
輸入 #1
8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2
輸出 #1
4
說明/提示
所有數據:n<=5000 a<=50 b<=200 s<=1000
xi<=280 yi<=100
題目大意及分析
題目意思很簡單,其中 椅子的高度a,陶陶手伸直的最大長度b 這句話完全是為了豐富題目的故事性。實際處理中直接求和使用就好,沒有什麼特別的。本題用背包可以解,將陶陶遇到蘋果摘與不摘 分為1,0,可以求解。但是這道題最佳的方法還是直接用貪心,直接開始摘最省力的蘋果(誰不喜歡輕鬆一點嘛) 只要高度也符合。摘到沒有力氣摘下一個蘋果為止。
代碼
#include<iostream>
#include<algorithm>
using namespace std;
struct apple//結構體保存這個蘋果的高度和所需要的力氣;
{
int h;
int w;
};
bool compare(apple x,apple y)//比較函數升序 < ,降序 > ;
{
return x.w<y.w;
}
int main()
{
int n,s,a,b,sum=0,coun=0;
cin >> n >> s;
cin >> a >> b;
apple p[n+1];
for(int i=0;i<n;i++)
{
cin >> p[i].h >> p[i].w;
}
sort(p,p+n,compare);//將數組按照所花力氣的大小升序排序;
for(int i=0;i<n;i++)
{
if(sum+p[i].w>s)
break;
if(p[i].h<=a+b)
{
sum+=p[i].w;
coun++;
}
}
cout << coun << endl;
return 0;
}