P1478 陶陶摘蘋果(升級版)


題目描述

又是一年秋季時,陶陶家的蘋果樹結了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;
}

更多內容大家可以訪問我的個人博客:一只大大怪


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM