由题意分析可知,每次摘得苹果的条件是椅子的高度加手伸直的最大长度大于等于苹果的高度并且剩余力气值必须大于等于所摘苹果需要的力气值,每摘一个苹果力气值相应减少,问题则是在此条件下求解能摘到的最多苹果数。我们可以以贪心的思想考虑,每次在符合高度的条件下摘取所需要最小力气的苹果,由此可以得出答案。而如何选取每次需要最小力气的苹果呢?那就可以通过结构体排序来解决,将摘苹果所需要的力气按升序排列或者降序排列,符合条件计数器加1,力气相应减少。代码如下:
#include<stdio.h> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<set> #include<cmath> #include<iostream> #include<string> using namespace std ; typedef struct{ int x ; int y ; }mea ; bool cmp( mea a , mea b ){ return a.y < b.y ; //使其升序排列 } int main(){ mea arr[5005] ; int n , s ; cin >> n >> s ; int a , b ; cin >> a >> b ; int tot = a + b ; for ( int i = 0 ; i < n ; i ++ ){ cin >> arr[i].x >> arr[i].y ; } sort( arr , arr + n , cmp ) ; int num = 0 ; for ( int i = 0 ; s >= 0 && i < n ; i ++ ){ // cout << arr[i].x << " " << arr[i].y << endl ; if ( tot >= arr[i].x && s >= arr[i].y ){ s -= arr[i].y ; num ++ ; } } cout << num ; return 0 ; }