zoukankan      html  css  js  c++  java
  • P1478 陶陶摘苹果(升级版)

    题目描述

    又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次她有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。

    这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下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

    题目描述

    又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次她有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。

    这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下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

    上面那位大哥想到了用dp求解,但是那个方程我确实没看懂,,,
    其实这个题可以看做是dp的背包问题
    我们有一个体力s
    对于每一个能摘(高度在范围之内)苹果我们只有摘或者不摘两种可能性
    so我们就把这个题转化到了01背包问题
    状态转移方程
    dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].v]+1);
    顺便说一下,为了保证dp的效率,我事先把所有的苹果都按高度排了个序,如果当前的苹果够不到,说明往后的苹果都够不到,直接退出就可以
    于是乎就产生了一个问题,第dp[n][maxt]不一定是最大值
    最大值需要在每次dp的时候都比较一下
    这是这道题和01背包唯一不同的地方

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 int n,maxt;
     8 int chair,hand;
     9 struct node
    10 {
    11     int high;
    12     int v;
    13 }a[10001];
    14 int comp(const node & a,const node & b)
    15 {
    16     if(a.high!=b.high)
    17     return a.high<b.high;
    18     else 
    19     return a.v<b.v;
    20 }
    21 int dp[5001][1001];
    22 int ans=0;
    23 int main()
    24 {
    25     scanf("%d%d%d%d",&n,&maxt,&chair,&hand);
    26     hand=hand+chair;
    27     for(int i=1;i<=n;i++)
    28         scanf("%d%d",&a[i].high,&a[i].v);
    29     sort(a+1,a+n+1,comp);
    30     for(int i=1;i<=n;i++)
    31     {
    32         if(hand>=a[i].high)
    33         {
    34             for(int j=0;j<=maxt;j++)
    35             {
    36                 if(a[i].v<=j)
    37                     dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].v]+1);
    38                 else
    39                 dp[i][j]=dp[i-1][j];
    40                 ans=max(ans,dp[i][j]);
    41             }
    42             
    43         }
    44         else
    45         break;
    46     }
    47     printf("%d",ans);
    48     return 0;
    49 }
     
  • 相关阅读:
    JavaScript进阶系列06,事件委托
    JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数
    JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
    JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象
    JavaScript进阶系列02,函数作为参数以及在数组中的应用
    JavaScript进阶系列01,函数的声明,函数参数,函数闭包
    委托、Lambda表达式、事件系列07,使用EventHandler委托
    委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
    委托、Lambda表达式、事件系列05,Action委托与闭包
    委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6863743.html
Copyright © 2011-2022 走看看